プログラミング 始めてみようかな!? 其の8



 四則演算(+-×÷ / 加減乗除)ならわかりますよね。でも、 “論理演算” とか “ビット演算” になると “?” マークが頭の中に浮かんできちゃいます。でも、プログラミングの基礎知識の一つとして“論理演算” や “ビット演算”を知っておくことは大切だそうです。


論理演算とビット演算

 

論理演算

 論理式を演算し、真(True / 値"1")か、偽(False / 値"0")か、を求めることで、ブール演算またはブーリアン演算とも言うそうです。
 数学で習った「集合」と同じような考えと思って良いのかもしれません。

 論理演算の種類には以下の4種類があるそうです。
 値は "0" と "1" のみ表現されます。

論理和(OR) : 集合論の和集合
 論理和は理論的な加算に相当します。
A+B出力(結果)
0+0
0+1
1+0
1+1
論理和は数値の論理加算により、 "0"か "1" が出力されます。 "0" と "1" のみ表現されるので、1+1でも2にはなりません。
論理積(AND) : 集合論の共通部分
 論理積は理論的な乗算に相当します。
A×B出力(結果)
0×0
0×1
1×0
1×1
かけ算と同じ結果になります。両方が "1" となったときに "1" が出力されます。
排他的論理和(Exclusive OR, EOR, XOR)
 排他的論理和は理論的な剰余算に相当します。
A XOR B出力(結果)
0 XOR 0
0 XOR 1
1 XOR 0
1 XOR 1
論理値が同じで無ければ "1" 、同じであれば "0" が出力されています。
否定(NOT)
 論理反転は、論理値が逆転します。
出力(結果)
値は "0" が "1" に、 "1" が "0" に。

■論理演算の真理値表

AND演算
ab結果
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse
OR演算
ab結果
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
XOR演算
ab結果
TrueTrueFalse
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
NOT演算
a結果
TrueFalse
FalseTrue
 
 

■論理演算子例

演算子名演算子例記述例意 味
論理和||a || ba と b を論理和 (OR)
論理積&&a && ba と b を論理積 (AND)
排他的論理和^^a ^^ ba と b の排他的論理和 (XOR)
否定!!aa を否定 (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
AND00001101
結果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" となるビット演算です。
AB出力(結果)
 
計算例
(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" となるビット演算です。
AB出力(結果)
 
計算例
(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" になるビット演算です。
AB出力(結果)
 
計算例
(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 | ba と b をビット論理和 (OR)
ビット積演算子&a & ba と b をビット論理積 (AND)
ビット差演算子^a ^ ba と b の排他的論理和 (XOR)
ビット反転演算子~~aa を否定(全ビットの逆転) (NOT)
ビット否定和演算子|/a |/ ba と b をビット否定論理和 (ORNOT)
ビット否定積演算子%/a %/ ba と b をビット否定論理積 (ANDNOT)
ビット否定差演算子^/a ^/ ba と b の排他的否定論理和 (XORNOT)
右シフト演算子>>a >> na を n ビット右シフト
左シフト演算子<<a << na を n ビット左シフト