人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

論理演算:ビット反転とビット抽出(XOR演算とAND演算)【Pythonで基本情報技術者になろう!】

f:id:hiro-htm877:20190619230445j:plain



 

f:id:hiro-htm877:20190601202549p:plain

 

 

 

  

 

論理演算を用いると、ビット操作を簡単にできる。

また、コンピュータの計算速度も簡単なため全体の実行速度が上がる!

 

現在、私は秋の基本情報技術者試験に向けて勉強中です。

その中で、私が得た知識をまとめて記事にしています。

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

Python基本情報技術者になろう!】

・ビット操作とマスクパターン

・ビット反転とビット抽出

Pythonで実験!

 

ビットを反転させる

ビットを反転させるには、排他的論理和(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(全ビットを反転させる)

 

2. 二つのビット列で排他的論理和(XOR)を取ると、元のビット列を反転させた結果が得られる。

00001111 ^ 11111111 = 11110000

ちなみに「ビットを反転させたい位置に'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

 

2. 二つのビット列で論理積(AND)を取ると、元のビット列からマスクパターンで指定した位置のビットだけが取り出されます。

01011011・00111100 = 00011000

 

  以上でビット反転とビット抽出の説明は終了です!

今回は論理演算もうまく使えば便利です!

使用用途としては、ラズパイなどのマイコンでセンサや通信の制御をする時に用いられます。

 

次は、この「ビット反転」と「ビット抽出」を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年