2005-11-10-02-【RPNToGo】第6回:ビット演算子事始め - project-enigma

2005-11-10-02-【RPNToGo】第6回:ビット演算子事始め

>> Site top >> weblog >> 月別アーカイブ >> 2005年11月のlog >> 2005-11-10-02-【RPNToGo】第6回:ビット演算子事始め

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


RPNToGo】第6回:ビット演算子事始め

2005 年 11 月 10 日

今回から「ビット演算子」についてその使い方やテクニックをまとめて行きたいと思います。今回は導入のくせにちょっと長いですが、Hacker room を勝ち抜くには必須の基礎知識です。頑張っていきましょう。

さて、ビット演算を知るにはまずビット表現を知っている必要がありますが、そもそも数値のビット表現というものはコンピュータ内部での処理で使われるもののため、プログラミングをしたことのない方には馴染みがないかもしれません。そこで、まず始めに数値がどのようにビットで表現されるかからまとめておきましょう。ここでは簡単に 4 桁のビット列で考えることにします。以下に 0 〜 15 の数値がどのようなビット列で表現されるかを示します。

数値 ビット列
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111

ひとまずは上の例を眺めてみてください。数値が増えていくにつれてビット表現は変化していきますが、そこに規則性があることに気づいたでしょうか。一番右のビットは 0 1 0 1 ... と変化し、その左のビットは 0 0 1 1 0 0 1 1 ...といった具合に変化しますね。実はビット表現では、右から数えて n 桁目は 2n-1 に対応しているのです。たとえば 13 。これはビット表現では 1101 ですが、これは以下のように解釈できます。

13 = 1 x 23 + 1 x 22 + 0 x 21 + 1 x 20

要するにビット表現というのは2進数なのですが、その辺のことに細かくふれるのはやめておきます。では、ビット表現に関する以上のことがらを踏まえて、各種のビット演算子を一巡りしてみましょう。

&演算子(ビットレベルの論理積)

&演算子はビットレベルの論理積を計算します。これは、2つの数値の各ビットが「両方とも1ならば1、それ以外は0」ということです。例として、10 と 12 の論理積を計算してみましょう。

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

右から数えて4ビット目だけが「両方とも1」ですから、結果は 1000 、すなわち 8 になります。

| 演算子(ビットレベルの論理和)

| 演算子はビットレベルの論理和を計算します。これは、2つの数値の各ビットが「両方とも0ならば0、それ以外は1」ということです。例として、先ほどと同様に 10と 12 を使って論理和を計算してみましょう。

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

一番右のビットだけが「両方とも0」ですから、結果は 1110 、すなわち 14 になります。

^ 演算子(ビットレベルの排他的論理和)

^ 演算子はビットレベルの排他的論理和を計算します。これは、2つの数値の各ビットが「互いに異なれば1、同じなら0」ということです。例として、またまた 10 と 12を使って排他的論理和を計算してみましょう。

    10 : 1010
    12 : 1100
^ ----------------
         0110

両端のビットは互いに等しいため 0 に、その他のビットは互いに異なるため 1 に。結果は 0110 、すなわち 6 になります。

<< 演算子(左方向へのビットシフト)

<< 演算子は左方向へのビットシフトを行います。シフトというのは、簡単に言えばビット表現を「ずらしていく」ことだと考えてください。ここでは、6 を 1 ビット左方向にシフトしてみましょう。

     6 : 0110
          ↓    << 1
    12 : 1100

1ビット左にシフトした結果、0110 は 1100 になりました。1100 は 12 を意味しています。つまり、6 -> 12 で2倍になったわけですね。一般に、n ビット左方向にシフトすると、2n 倍する効果があります。3 ビット左シフトなら 23 = 8 倍ということですね。ただし、数値を表現するビット幅を超えて数が増えることはありません(RPNToGo での数式の計算では 32 ビット整数を使用しています)。

>> 演算子(右方向へのビットシフト)

>> 演算子は右方向へのビットシフトを行います。シフトというのは、簡単に言えばビット表現を「ずらしていく」ことだと考えてください。ここでは、10 を 1 ビット左方向にシフトしてみましょう。

    10 : 1010
          ↓    >> 1
     5 : 0101

1ビット右にシフトした結果、1010 は 0101 になりました。0101 は 5 を意味しています。つまり、10 -> 5 で半分になったわけですね。一般に、n ビット右方向にシフトすると、2n で割る効果があります。3 ビット右シフトなら 23 = 8 で割る、ということですね。ただし、シフト時に右端に消えていった1のビットは失われます。つまり、9 ( 1001 ) を 1ビット右にシフトすると 4 ( 0100 ) になります。

...さて、まだ論理否定演算子と補数演算子が残っているのですが、長くなってしまったので続きは次回にするとしましょう。

 

コメント

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

 

このページのタグ

Page tag : Palm

 

 


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