論理演算を用いると、ビット操作を簡単にできる。
また、コンピュータの計算速度も簡単なため全体の実行速度が上がる!
現在、私は秋の基本情報技術者試験に向けて勉強中です。
その中で、私が得た知識をまとめて記事にしています。
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
ビットを反転させる
ビットを反転させるには、排他的論理和(XOR)を用います。
ここで、XOR回路とは「なんだっけ?」と言いますと、
XOR回路は「他人と同じはイヤ!」回路です。
(2つの入力が同じ場合は ’0’を異なる場合は'1' を出力する)
つまり、2入力に対しての動作を見ますと、
(XOR演算子= '^')
0^0=0、 0^1=1
1^0=1、 1^1=0
反転させる手順は以下の通りです。
1. 反転させたい元のビット列に対して、「ビットを反転させたい位置に'1'を入れたビット列」を用意します。
反転させたい元のビット列
00001111
反転させたい位置に'1'を入れたビット列
11111111(全ビットを反転させる)
ちなみに「ビットを反転させたい位置に'1'を入れたビット列」のことをマスクパターンと呼びます。
反転させたい元のビット列
00001111 = b
・全反転させたいなら
b ^(XOR) 11111111
・下位4ビットのみを反転させたいなら
b ^(XOR) 00001111
特定のビット列を取り出す
ビットを取り出す場合は、論理積(AND)を用います。
ここで、「ANDってなんだっけ?」という方のために説明します。
2入力に対する動作はこうなります。(AND演算子 = '・')
0・0 = 0、 0・1 = 0
1・0 = 0、 1・1 = 1
つまり、入力が両方とも'1'の時に'1'を出力する回路です!
特定のビットを取り出す手順は以下の通りです。
1. 取り出したい元のビット列に対して、「ビットを取り出したい位置に'1'を入れたビット列」=マスクパターンを用意します。
取り出したい元のビット列
01011011
取り出したい位置に'1'を入れたビット列
00111100
以上でビット反転とビット抽出の説明は終了です!
今回は論理演算もうまく使えば便利です!
使用用途としては、ラズパイなどのマイコンでセンサや通信の制御をする時に用いられます。
次は、この「ビット反転」と「ビット抽出」をPythonで実装していきたいと思います!
Pythonで「ビット反転」と「ビット抽出」
ビット反転
code
print("ビット反転")
print("00001111 ^ 11111111 =", bin(0b00001111 ^ 0b11111111))
print("11110000 ^ 00001111 =", bin(0b11110000 ^ 0b00001111))
出力
NAND演算
ビット反転
00001111 ^ 11111111 = 0b11110000
11110000 ^ 00001111 = 0b11111111
ビット抽出
code
print("ビット抽出")
print("01011011 & 00111100 =", bin(0b01011011 & 0b00111100))
print("11111111 & 10101010 =", bin(0b11111111 & 0b10101010))
出力
ビット抽出
01011011 & 00111100 = 0b11000
11111111 & 10101010 = 0b10101010
「ビット反転」と「ビット抽出」ができました!
参考資料
・キタミ式イラストIT塾 基本情報技術者 平成31/01年