四則演算(+-×÷ / 加減乗除)ならわかりますよね。でも、 “論理演算” とか “ビット演算” になると “?” マークが頭の中に浮かんできちゃいます。でも、プログラミングの基礎知識の一つとして“論理演算” や “ビット演算”を知っておくことは大切だそうです。
論理演算とビット演算
論理演算
論理式を演算し、真(True / 値"1")か、偽(False / 値"0")か、を求めることで、ブール演算またはブーリアン演算とも言うそうです。
数学で習った「集合」と同じような考えと思って良いのかもしれません。
論理演算の種類には以下の4種類があるそうです。
値は "0" と "1" のみ表現されます。
- 論理和(OR) : 集合論の和集合
- 論理和は理論的な加算に相当します。
A+B | 出力(結果) |
---|
0+0 | 0 |
0+1 | 1 |
1+0 | 1 |
1+1 | 1 |
論理和は数値の論理加算により、 "0"か "1" が出力されます。 "0" と "1" のみ表現されるので、1+1でも2にはなりません。 - 論理積(AND) : 集合論の共通部分
- 論理積は理論的な乗算に相当します。
A×B | 出力(結果) |
---|
0×0 | 0 |
0×1 | 0 |
1×0 | 0 |
1×1 | 1 |
かけ算と同じ結果になります。両方が "1" となったときに "1" が出力されます。 - 排他的論理和(Exclusive OR, EOR, XOR)
- 排他的論理和は理論的な剰余算に相当します。
A XOR B | 出力(結果) |
---|
0 XOR 0 | 0 |
0 XOR 1 | 1 |
1 XOR 0 | 1 |
1 XOR 1 | 0 |
論理値が同じで無ければ "1" 、同じであれば "0" が出力されています。 - 否定(NOT)
- 論理反転は、論理値が逆転します。値は "0" が "1" に、 "1" が "0" に。
■論理演算の真理値表
AND演算 |
---|
a | b | 結果 |
---|
True | True | True |
True | False | False |
False | True | False |
False | False | False |
OR演算 |
---|
a | b | 結果 |
---|
True | True | True |
True | False | True |
False | True | True |
False | False | False |
XOR演算 |
---|
a | b | 結果 |
---|
True | True | False |
True | False | True |
False | True | True |
False | False | False |
NOT演算 |
---|
a | 結果 |
---|
True | False |
False | True |
| |
| |
■論理演算子例
演算子名 | 演算子例 | 記述例 | 意 味 |
---|
論理和 | || | a || b | a と b を論理和 (OR) |
論理積 | && | a && b | a と b を論理積 (AND) |
排他的論理和 | ^^ | a ^^ b | a と b の排他的論理和 (XOR) |
否定 | ! | !a | a を否定 (NOT) |
否定論理和 | | | (ORNOT) |
否定論理積 | | | (ANDNOT) |
否定排他的論理和 | | | (XORNOT) |
ビット演算の前に...
ビット演算の前に、ちょっと一例を...
ゲーム機を操作するには、幾つものボタンがありますよね。仮に八つのボタン "A" 、 "B" 、 "C" 、 "D" 、 "E" 、 "F" 、 "G" 、 "H" 、があるとします。
"A" に "1" (2進数では "00000001")
"B" に "2" (2進数では "00000010")
"C" に "4" (2進数では "00000100")
"D" に "8" (2進数では "00001000")
"E" に "16" (2進数では "00010000")
"F" に "32" (2進数では "00100000")
"G" に "64" (2進数では "01000000")
"H" に "128" (2進数では "10000000")
と数値が割り振られているとします。
どのボタンが押されたかを判断するには、押されたボタンの数値で判断できます。 "C" が押されれば "4" 、 "H" が押されれば "128" ですが、とあるゲームの一場面では 、 "A" 、 "C" 、 "D" 、の三つのボタンしか機能しないように設定したいとすると、 "1 + 4 + 8 = 13" (2進数では "00001101") なので、
ボタン | A |
---|
2進数 | 00000001 |
---|
AND | 00001101 |
---|
結果 | 00000001 |
---|
B |
---|
00000010 |
00001101 |
00000000 |
C |
---|
00000100 |
00001101 |
00000100 |
D |
---|
00001000 |
00001101 |
00001000 |
E |
---|
00010000 |
00001101 |
00000000 |
F |
---|
00100000 |
00001101 |
00000000 |
A + C |
---|
00000101 |
00001101 |
00000101 |
C + E |
---|
00010100 |
00001101 |
00000100 |
"A" 13 & 1 = 1
"B" 13 & 2 = 0
"C" 13 & 4 = 4
"D" 13 & 8 = 8
"E" 13 & 16 = 0
"F" 13 & 32 = 0
...
"A & C" 13 & (1 + 4) = 5
"C & E" 13 & (4 + 16) = 4
結果が "0"("00000000") であれば、ボタンの機能を使えなくすることが簡単に判断できます。逆に、結果が "0"("00000000") であれば、機能を使えるようにすることもできますね。
また、複数のボタン、例えば "F" 、 "G" 、が押された場合、 "F" は "32" (2進数では "00100000")、 "G" は "64" (2進数では "01000000")、なので、 "32 + 64 = 96"(2進数では "01100000")
"F | G" 32 | 64 = 96 ("00100000" OR "01000000" = "01100000") という演算を行うことになります。
ビット演算
「論理演算」に基づいて計算処理をして、ビットを直接操作する演算だそうです。
計算をビット単位で行うと、効率的な演算が行えるそうで、基本的に8の倍数個(バイト単位)をまとめて行うそうです。
ビット演算子が適用できるのは、整数型に対してだけだそうです。
論理演算の種類には以下の5種類があるそうです。
値は "0" と "1" のみ表現されます。
- ビット和演算(OR)
- 2つのビットを比較して、一方だけでも "1" のときに、結果が "1" となるビット演算です。
| | 計算例 |
---|
(a) | | 1 0 1 0 0 0 1 1 | (b) | |) | 0 0 0 0 1 1 1 0 | 結果 | 1 0 1 0 1 1 1 1 |
|
- ビット積演算(AND)
- 2つのビットを比較して、両者がともに "1" のときにだけ、結果が "1" となるビット演算です。
| | 計算例 |
---|
(a) | | 1 0 1 0 1 0 0 1 | (b) | &) | 0 0 0 0 1 1 1 1 | 結果 | 0 0 0 0 1 0 0 1 |
|
- ビット排他的論理和(Exclusive OR, EOR, XOR)
- 2つのビット同士を比較して、いずれか一方だけが "1" のときに結果が "1" になるビット演算です。
| | 計算例 |
---|
(a) | | 1 0 1 0 0 0 1 1 | (b) | ^) | 0 0 0 0 1 1 1 0 | 結果 | 1 0 1 0 1 1 0 1 |
|
- ビット否定(NOT)
- ビットが "0" なら "1" に、"1" なら "0" にする演算です。
| | 計算例 |
---|
| 1 0 1 0 0 0 1 1 | ~) | | 結果 | 0 1 0 1 1 1 0 0 |
|
- ビットシフト演算
- ビット列をずらす操作を行います。
上位桁方向(左)にずらす左シフト演算と、下位桁方向(右)にずらす右シフト演算とがあります。 | シフト | 出力(結果) |
---|
1 0 1 0 0 0 1 1 | >> 1 | 0 1 0 1 0 0 0 1 |
1 0 1 0 0 0 1 1 | << 2 | 1 0 0 0 1 1 0 0 |
ずれて空たいビットは "0" で埋められます。
左に1ビットシフトすると、値が2倍に、右に1ビットシフトすると、値が1/2になります。
■ビット演算子例
演算子名 | 演算子例 | 記述例 | 意 味 |
---|
ビット和演算子 | | | a | b | a と b をビット論理和 (OR) |
ビット積演算子 | & | a & b | a と b をビット論理積 (AND) |
ビット差演算子 | ^ | a ^ b | a と b の排他的論理和 (XOR) |
ビット反転演算子 | ~ | ~a | a を否定(全ビットの逆転) (NOT) |
ビット否定和演算子 | |/ | a |/ b | a と b をビット否定論理和 (ORNOT) |
ビット否定積演算子 | %/ | a %/ b | a と b をビット否定論理積 (ANDNOT) |
ビット否定差演算子 | ^/ | a ^/ b | a と b の排他的否定論理和 (XORNOT) |
右シフト演算子 | >> | a >> n | a を n ビット右シフト |
左シフト演算子 | << | a << n | a を n ビット左シフト |