2005-11-18-01-【RPNToGo】第10回:ビットレベルの論理和演算子 - project-enigma

2005-11-18-01-【RPNToGo】第10回:ビットレベルの論理和演算子

>> Site top >> weblog >> 月別アーカイブ >> 2005年11月のlog >> 2005-11-18-01-【RPNToGo】第10回:ビットレベルの論理和演算子

最終更新日付:2013/12/31 07:40:17


RPNToGo】第10回:ビットレベルの論理和演算子

2005 年 11 月 18 日

RPNToGo のテクニック紹介、10回目の今回は「論理和演算子」について解説をしていきます。論理積演算子との対応がわかりやすいように、前回と極力似せた記述でお送りします(手抜き? まぁそう言いなさんな)。

先日のビット演算子をひと巡りするエントリで説明したとおり、論理和は2項演算子で、2つの値の対応するビットがともに 0 であれば計算結果の対応するビットも 0 に、それ以外であればそのビットは1 になります。つまり、「少なくともいずれかが 1 なら 1、共に 0 なら 0」ということですね。以前は以下のような例を示しました。

    10 : 1010
    12 : 1100
|----------------
         1110

このことからわかるのは、「論理和は2つの値よりも小さくなることはない」ということです。論理和の計算結果が最大となるのは、2つの値の各ビットが互いに異なる時で、結果は2つの値の和になります。たとえば以下のように。

    10 : 1010
     5 : 0101
|----------------
         1111  ・・・ 15

逆に、計算結果が最小となるのは、2つの値が互いに等しい時で、結果は同じ値になります。たとえば以下のように。

    10 : 1010
    10 : 1010
|----------------
         1010  ・・・ 10

このように、ビットレベルの論理和演算子は、「値を増加させる」という目的で使用されるのが一般的です。では、いくつか面白い(と陰郎が思う)テクニックを紹介しましょう。

以前のエントリでも少し触れましたが、補数演算子はビット反転を行うため、ある値とその補数の論理和を計算すると、それは確実に -1 になります。これは論理和演算子が値を増加させないという意味で、例外的です。ここでは、10 とその補数である -11 で考えましょう。便宜上、ここでは 8 ビットで表現します。

    10 : 00001010
   -11 : 11110101
|----------------
         11111111  ・・・  -1

では次。論理和はその定義から、適当な数字と 0 で論理和を計算しても計算結果は元の値と変わりません。このことから、たとえば以下のようにしても値はそのままで Three card を実現できます。もちろん、 - の代わりに | をもうひとつ使ってもいいんですけどね。

5  5  5  -  |

さらにもうひとつ。論理和は加算演算子と異なり、重複するビット分は数が増えませんから、たくさん使ってもそれほど値が増えることはありません。たとえば以下の計算結果は 7 になります。これなんて Straight で Four card ですね。

1  2  3  4  5  |  |  |  |

...いかがでしょうか。ビット演算を効果的に使用できるようになると、数値を自由自在に扱うことができるようになります...などとまとめっぽいことを書きましたが、次回は「排他的論理和演算子」です。まだビットシフトも残ってますし、まだまだ続きますよ。それではまた次回。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.