ビット演算子

広告

整数の値に対してビット単位で処理を行うために用意されているのがビット演算子です。次の演算子が用意されています。

演算子使用例意味
&a & ba と b のビットAND
a | ba と b のビットOR
^a ^ ba か b のビットXOR
~~ aa のビットNOT
<<a << ba を左へ bビット分シフト
>>a >> ba を右へ bビット分シフト

MySQLではビット演算に BIGINT(64ビット) 演算を使用し、結果は符合なしの 64 ビット整数となります。例えば14という値は64ビットで表すと次のようになります。

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001110

では一つ一つ確認していきます。

ビットAND

ビットANDは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に1の場合だけ1にします。次の例を見てください。

85 & 15

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001111  = 15
-----------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101  = 5

85と15のビットANDを取ると15を取得します。

では試してみます。

mysql> select 85 & 15;

p9-1

ビットOR

ビットORは演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか一つでもビット1の場合に1にします。次の例を見てください。

85 | 15

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001111  = 15
-----------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01011111  = 95

85と15のビットORを取ると95を取得します。

では試してみます。

mysql> select 85 | 15;

p9-2

ビットXOR

ビットXORは演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか一つがビット1の場合に1にします。両方とも1の場合や両方とも0の場合は0にします。次の例を見てください。

85 | 15

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001111  = 15
-----------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01011010  = 90

85と15のビットXORを取ると90を取得します。

では試してみます。

mysql> select 85 ^ 15;

p9-3

ビットNOT

ビットNOTは演算子の右辺の値の各ビットを反転(0なら1に、1なら0にする)させます。次の例を見てください。

~85

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
-----------------------------------------------------------------------
11111111 11111111 11111111 11111111 11111111 11111111 11111111 10101010  = 18446744073709551530

85のビットNOTを取ると18446744073709551530を取得します。

では試してみます。

mysql> select ~85;

p9-4

左シフト

<<演算子は対象の値を指定した数だけ左へシフトします。次の例を見てください。

85 << 2

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
-----------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000001 01010100  = 340

85を2ビット分左へシフトすると340を取得します。(1ビット左へシフトすると2倍することに相当します)。

では試してみます。

mysql> select 85 << 2;

p9-5

右シフト

>>演算子は対象の値を指定した数だけ右へシフトします。次の例を見てください。

85 >> 2

00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010101  = 85
-----------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010101  = 21

85を2ビット分右へシフトすると21を取得します。(1ビット右へシフトすると1/2倍することに相当します)。

では試してみます。

mysql> select 85 >> 2;

p9-6

( Written by Tatsuo Ikura )