<<
,>>
,&
,|
,^
,~
これまで,数値や文字(ASCIIコード番号)の比較,算術について見てきました。ここでは,コンピュータならではの二進法での比較や算術を見ます。
メモリにデータが記憶されるときの1単位は1byte です。1byte は 8-bit,そして1つのビットに 0
か 1
が入ります。例えば,unsigned char
型の場合は 8-bit ですが,これは 0
と 1
からなる8個のデータで整数を表現することになります。
0
と 1
からなる値と言えば,二進法です。例えば,十進法での 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が代入される。x が unsigned の場合,x×2n に等しい。 |
x>>n | ビット単位の右シフト演算子 (Bitwise Shift Operator) | n ビット分右シフト。シフトで空いたビットには0が代入される。x が unsigned の場合,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かを見て,x か y に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 = ~0
(unsigned 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]