ビット演算子の使い方

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

演算子使用例意味
&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ビットで表すと次のようになります。

0000000000000000000000000000000000000000000000000000000000001110

ビット演算子の使い方について解説します。

(Last modified: )

ビットAND

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

a & b

次の例を見てください。

85 & 15

0000000000000000000000000000000000000000000000000000000001010101  = 85
0000000000000000000000000000000000000000000000000000000000001111  = 15
-----------------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000000000101  = 5

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

では試してみます。

select 85 & 15;

ビットAND(1)

ビットOR

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

a | b

次の例を見てください。

85 | 15

0000000000000000000000000000000000000000000000000000000001010101  = 85
0000000000000000000000000000000000000000000000000000000000001111  = 15
-----------------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000001011111  = 95

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

では試してみます。

select 85 | 15;

ビットOR(1)

ビットXOR

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

a ^ b

次の例を見てください。

85 ^ 15

0000000000000000000000000000000000000000000000000000000001010101  = 85
0000000000000000000000000000000000000000000000000000000000001111  = 15
-----------------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000001011010  = 90

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

では試してみます。

select 85 ^ 15;

ビットXOR(1)

ビットNOT

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

~a

次の例を見てください。

~85

0000000000000000000000000000000000000000000000000000000001010101  = 85
-----------------------------------------------------------------------
1111111111111111111111111111111111111111111111111111111110101010  
 = 18446744073709551530

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

では試してみます。

select ~85;

ビットNOT(1)

左シフト

<<演算子は対象の値を指定した数だけ左へシフトします。

a << b

次の例を見てください。

85 << 2

0000000000000000000000000000000000000000000000000000000001010101  = 85
-----------------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000101010100  = 340

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

では試してみます。

select 85 << 2;

左シフト(1)

右シフト

>>演算子は対象の値を指定した数だけ右へシフトします。

a >> b

次の例を見てください。

85 >> 2

0000000000000000000000000000000000000000000000000000000001010101  = 85
-----------------------------------------------------------------------
0000000000000000000000000000000000000000000000000000000000010101  = 21

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

では試してみます。

select 85 >> 2;

右シフト(1)

-- --

MySQL にてビット演算子の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。