ビット演算子の使い方

ビット演算子とは整数に対してビット単位で演算を行うための演算子です。ここでは Ruby でビット演算子を使う方法について解説します。

(Last modified: )

ビット演算子の一覧

ビット演算子とは整数に対してビット単位で演算を行うための演算子です。 Integer クラスのオブジェクトに対して使われます。ビット演算子には次のものが用意されています。

演算子記述例意味
&a & bビットAND
|a | bビットOR
^a ^ bビットXOR
~~aビット反転
<<a << b左シフト
>>a >> b右シフト

ビット演算子の中で左シフトと右シフトはシフト演算子とも呼ばれます。シフト演算子については「シフト演算子の使い方」で確認します。ではそれぞれの演算子について確認してみます。

※演算子の優先順位については「演算子の優先順位(関係演算子、論理演算子)」を参照して下さい。

ビットAND

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

a & b

例として 11 と 14 の ビットAND を取ってみます。

1011  = 11
1110  = 14
------------
1010  = 10

数値の 11 と 14 をそれぞれ 2 進数で表します。そして各ビットを比較しますが ビットAND の場合は両方の値のビットが 1 になっている場合は 1 を、それ以外は 0 とします。その結果、 2 進数の 1010 ( 10 進数の 10 )と言う結果を取得することができます。

num1 = 11
num2 = 14
puts(num1 & num2)

上記では結果として 10 が出力されます。

ビットOR

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

a | b

例として 10 と 12 の ビットOR を取ってみます。

1010  = 10
1100  = 12
------------
1110  = 14

数値の 10 と 12 をそれぞれ2進数で表します。そして各ビットを比較しますが ビットOR の場合はどちらかの値のビットが 1 になっている場合は 1 を、それ以外は 0 とします。その結果、 2 進数の 1110 ( 10 進数の 14 )と言う結果を取得することができます。

num1 = 10
num2 = 12
puts(num1 | num2)

上記では結果として 10 が出力されます。

ビットXOR

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

a ^ b

例として 10 と 12 の ビットXOR を取ってみます。

1010  = 10
1100  = 12
------------
0110  = 6

数値の 10 と 12 をそれぞれ 2 進数で表します。そして各ビットを比較しますが ビットXOR の場合は 2 つの値のビットの値が異なっている場合は 1 を、それ以外は 0 とします。その結果、 2 進数の 0110( 10 進数の 6 )と言う結果を取得することができます。

num1 = 10
num2 = 12
print(num1 ^ num2)

上記では結果として 10 が出力されます。

ビットNOT

ビットNOT は演算子の右辺の値の各ビットに対して 1 の場合は 0 に、 0 の場合は 1 にします。

~ a

例として 10 の ビットNOT を取ってみます。

0000000000001010  = 10
-----------------------
1111111111110101  = -11

対象となる数値の 10 を 2 進数で表します。そして ビットNOT の場合はビットが 1 の場合は 0 に、ビットが 0 の場合は 1 とします。その結果、 2 進数の 1111111111110101 ( 10 進数の -11 )と言う結果を取得することができます。

num1 = 10
print(~num1)

上記では結果として -11 が出力されます。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

num1 = 11
num2 = 14
print(num1, " & ", num2, " = ", num1 & num2, "\n")

num1 = 10
num2 = 12
print(num1, " | ", num2, " = ", num1 | num2, "\n")

print(num1, " ^ ", num2, " = ", num1 ^ num2, "\n")
print("~ ", num1, " = ", ~num1, "\n")

下記のように実行して下さい。

ビット演算子

-- --

Ruby でビット演算子を使う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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