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

2005-11-16-01-【RPNToGo】第9回:ビットレベルの論理積演算子

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

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


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

2005 年 11 月 16 日

気がつけば RPNToGo のテクニック紹介も9回目ですね。今日から Hacker room の演算子についてごたごたと書いていきすので、お読みになって下さる方はお願いですからついてきてください。では始めましょうか。今回は「論理積演算子」です。

先日のビット演算子をひと巡りするエントリで説明したとおり、論理積は2項演算子で、2つの値の対応するビットが 1 であれば計算結果の対応するビットも1に、それ以外であればそのビットは 0 になります。先日の例では、10 と 12 の論理積を計算してみました。こんなんでしたね。

    10 : 1010
    12 : 1100
&----------------
         1000

このことからわかるのは、「論理積は2つの値よりも大きくなることはない」ということです。論理積の計算結果が最大となるのは、2つの値が互いに等しい時で、結果は同じ値になります。たとえば以下のように。

    10 : 1010
    10 : 1010
&----------------
         1010

逆に、計算結果が最小となるのは、全部のビットが0になってしまうような組み合わせの場合で、計算結果はつねに0となります。たとえば以下のように。

    10 : 1010
     4 : 0100
&----------------
         0000

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

前回のエントリでも少し触れましたが、補数演算子はビット反転を行うため、ある値とその補数の論理積を計算すると、それは確実に0になります。ここでは、10 とその補数である -11 で考えましょう。便宜上、ここでは 8 ビットで表現します。

    10 : 00001010
   -11 : 11110101
&----------------
         00000000

...というわけですね。ここで、「11110101 は 245 じゃないのか?」と思われた方もいると思います。これは、「最上位ビットが 1 の場合は負数として扱う」というルールがあるからなのですが、そのことはまぁ気にしないでおきましょう。話すとかなり長くなるので。

次に、引き算と同じ効果を生み出すテクニックを1つ紹介しましょう。使うのは論理積演算子と補数演算子です。やり方は簡単で、小さな方の数の補数を計算してから、大きな数との論理積を計算するだけです。ここでは、5 と 1 で考えましょう。すると、次のようにカードを並べることになります。

5  1  〜  &

すると、1 の補数 ── つまり -2 ── と 5 の論理積を計算することになりますね。それは、以下のようになります。ここでは8ビット表記で。

     5 : 00000101
    -2 : 11111110
&----------------
         00000100

どうでしょう? 結果は 5 - 1 の答えであるところの 4 になりましたね。補数演算子はビット反転をしますから、その結果と論理積をとればこのようなことも実現できるわけです。これはプログラミングの世界で言う「ビットマスク」と呼ばれるテクニックの一種で、消したいビットを持つ値の補数で論理積をとることによりビット除去を行うというものです。ただし、このテクニックは2つの値のビット構成が包含関係になければ意味がありません。たとえば、このテクニックを4と1で使用しても結果は4になり、引き算と同じ結果にはなりませんので注意してください。

う〜ん、勢いにまかせて書いたらちょいと散漫になってしまいましたが、いかがだったでしょうか。各演算子の紹介が終るまではこんな調子で進んでしまうので、退屈に思われる方がいるようでしたらごめんなさい。ではまた次回。

 

コメント

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

 

このページのタグ

Page tag : Palm

 

 


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