法大奥山研究室

 previous  contents

7.7. ビット演算子 <<>>&|^~


 これまで,数値や文字(ASCIIコード番号)の比較,算術について見てきました。ここでは,コンピュータならではの二進法での比較や算術を見ます。

 メモリにデータが記憶されるときの1単位は1byte です。1byte は 8-bit,そして1つのビットに 01 が入ります。例えば,unsigned char型の場合は 8-bit ですが,これは 01 からなる8個のデータで整数を表現することになります。

 01 からなる値と言えば,二進法です。例えば,十進法での 15 は,

1×23 + 1×22 + 1×21 + 1×20 = 15

ですので,二進法に直すと 1111 となります。これを 8-bit のデータで表せば,

00001111

となります。

 さて,これを 1-bit 分左にシフトさせ,空いた部分に 1 を入れると,

00011111

となります。これは十進法での 31 であり,元の数に 16 を加えた大きさです。逆に,元の状態から右へ 1-bit 分シフトさせ,空いた部分に 0 を入れると,

00000111

すなわち,十進法で 7 になり,元の数から 8 を引いた数になります。

■ビット演算子(Bitwise Operators)
x<<nビット単位の左シフト演算子
(Bitwise Shift Operator)
n ビット分左シフト。シフトで空いたビットには0が代入される。xunsigned の場合,x×2n に等しい。
x>>nビット単位の右シフト演算子
(Bitwise Shift Operator)
n ビット分右シフト。シフトで空いたビットには0が代入される。xunsigned の場合,x/2n に等しい。
~xビット単位の補数演算子
(Bitwise Complement Operator)
各ビットについて0と1を反転。unsigned の場合,最大値の補数となる。
x&yビット単位の論理AND演算子
(Bitwise AND Operator)
ビット毎の論理積。
x^yビット単位の排他論理OR演算子
(Bitwise Exclusive OR Operator)
ビット毎の排他論理和。両者が1のビットに0を。
x|yビット単位の論理OR演算子
(Bitwise Inclusive OR Operator)
ビット毎の論理和。ビット毎に1か0かを見て,xy に1があればそのビットに1。すなわち,両者が0のビットに0。
/* Example 7.10 */

#include <stdio.h>

int main(void)
{
       unsigned short x = 0, y = ~0;
       int n;

       printf("%u (%x) [%hu, %hx]\n", x, x, ~x, ~x);

       for(n = 0; x != y; n++) {
              x = x | (1<<n);
              printf("%u (%x) [%hu, %hx]\n", x, x, ~x, ~x);
       }

       return 0;
}

この例は,0 であった x をその補数 y = ~0unsigned short の最大値)に等しくない限り,2進法で右から 1 を次から次へと入れていったものです。すなわち,

0000000000000000
0000000000000001
0000000000000011
0000000000000111
0000000000001111
...

という変化を見たものです。short へは整数拡張が施されるため,補数の出力に対する変換指定子に short型での出力を意味する h を付しています。

 実行結果です。

0 (0) [65535, ffff]
1 (1) [65534, fffe]
3 (3) [65532, fffc]
7 (7) [65528, fff8]
15 (f) [65520, fff0]
31 (1f) [65504, ffe0]
63 (3f) [65472, ffc0]
127 (7f) [65408, ff80]
255 (ff) [65280, ff00]
511 (1ff) [65024, fe00]
1023 (3ff) [64512, fc00]
2047 (7ff) [63488, f800]
4095 (fff) [61440, f000]
8191 (1fff) [57344, e000]
16383 (3fff) [49152, c000]
32767 (7fff) [32768, 8000]
65535 (ffff) [0, 0]

 previous  contents