論理演算
2進数値0と1で演算する方法
1を真(True)、0を**偽(False)**とする
- 論理積(AND) ・・・ AとBのビットが両方とも1ならば、結果は1。それ以外は0。(掛け算)
- 論理和(OR) ・・・ AとBのビットが両方とも1、または一つでも1ならば結果は1。両方0ならば0。(足し算)
- 否定(NOT) ・・・ Aが0ならば、結果は1。Aが1ならば、結果は0。
- 排他的論理和(XOR) ・・・ AとBのビットが両方とも1または両方とも0ならば、結果は0。それ以外は1。
A | B | A AND B | A OR B | A XOR B |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
A | NOT A |
---|---|
0 | 1 |
1 | 0 |
複数ビットの演算の場合
各桁ごとで演算
\begin{matrix}
&1010 \\
AND &1100 \\
\hline
&1000
\end{matrix}
\begin{matrix}
&1010 \\
OR &1100 \\
\hline
&1110
\end{matrix}
シフト演算
桁を移動させる操作
一番左側のビット(符号ビット)の扱いで論理シフトと算術シフトに分かれる
数値を2倍や1/2倍にしたいときに使用する
数値を1ビット左シフトするごとに2倍、1ビット右シフトするごとに1/2倍になる(つまり、2ビット左シフトだと4倍したことになる)
- 論理シフト ・・・ 全体をずらす(シフトしたことにより桁あふれをしたビットは捨てて、空いたビットには0を補う)
1 1 0 0 1 1 0 1
↓ 左に2ビット論理シフト(あふれた桁は捨てる)
0 0 1 1 0 1 0 0
← 0を補う
↓ 右に2ビット論理シフト(あふれた桁は捨てる)
0 0 0 0 1 1 0 1
- 算術シフト ・・・ 最上位(符号)ビットは固定し、それ以外はずらす
1 1 0 0 1 1 0 1
↓ 左に2ビット算術シフト(あふれた桁は捨てる)
1 0 1 1 0 1 0 0
← 最上位ビットだけ残して、あふれ桁を捨てる
↓ 右に2ビット算術シフト(あふれた桁は捨てる)
1 1 1 0 1 1 0 1
← 最上位ビットと同じ値を補う