ご覧いただきありがとうございます。
この記事は、ビット演算子について優しく解説しています。
Python初心者の方はぜひご覧ください。
それでは早速学習を進めていきましょう。
学習を進めるために、Google Colaboratoryを開いてください。
まだインストールしていない方はこちらのURLからインストールしましょう。
ビット演算子
本日のタイトルはビット演算子です。
これまで様々な演算子を学習してきました。
今回はさらに新しいビット演算子というものを学習していきます。
ビット演算子は、2進数のint型に対して用いられるものです。
2進数は0と1のみを組み合わせて表現される数字のことです。
ビット演算子もいくつか種類がありますので、活用の幅を広げるといった意味合いで学習を進めていきましょう。
論理和
まずはこちらのコードをみてください。
x = 0b0111
y = 0b0100
z = x | y
print(z)
このコードでは、まずxとyの変数に2進数をそれぞれ代入しました。
0b0111と0b0100の「0b」は2進数の値ですよとコンピュータに認識させるための合図です。0bを忘れて値だけ入力したら、うまく出力されません。
0bをつけて2進数の値を入力したら、次に今回の主役であるビット演算子、
論理和(|)
の登場です。
z = x | y
このコードで使用している「|」のビット演算子は、
xとyでそれぞれ入力した「0b0111」と「0b0100」の、
「0111」と「0100」の部分において、同じ桁同士を対応させて、
1が少なくとも一つあれば、1を返し、
0だけであれば、0を返します。
上のコードでは、次の図のようにコンピュータは認識します。
したがって、zは「0111」となり、それを出力すると、
10進数である「7」が出力されます。
ちなみに2進数のまま、すなわち「111」を出力させたい場合は、
print(z)
ではなく、
print(bin(z))
と記すことで、「111」が出力されます。
その他の数字でも自分で確かめてみてくださいね。
排他的論理和
まずはこちらのコードをみてください。
x = 0b0111
y = 0b0100
z = x ^ y
print(z)
論理和のコードと異なる部分はどこですか?
zの式で、「^」の演算子であることですね。
論理和と同様にxとyの比較が行われますが、「^」を使用した場合は、こうです。
同じ桁同士を比較して、どちらも同じ数字であれば「0」を、
そうでなければ「1」をといった感じですね。
したがって、上のコードの出力は、
10進数で「3」、2進数で「11」となるわけです。
論理積
x = 0b0111
y = 0b0100
z = x & y
print(z)
もうどこが違うでしょうと言っても違うところが分かってきたと思うので、
わざわざ質問しません。
論理積というビット演算子では、「&」を使用します。
「&」を使用すると、xとyの値をコンピュータは次のように比較します。
すなわち、同じ桁同士を比較して両方とも1だったら「1」を、
そうでなければ、「0」を返すわけです。
したがって、出力した結果は、10進数で「4」を、
2進数では、「100」となります。
反転
~1
みなさんこのコードをそのまま出力してみてください。
何が出てきましたか?
「-2」が出てくると思います。
「~」は、反転のビット演算子と言われています。
入力した値をxとすると、出力される値は、
-(x + 1)
となります。
だから、上のコードで出力された値は-2だったんです。
これまで示してきたコード風にこの反転の演算子を使用するとこうです。
x = 0b0111
y = ~x
print(y)
xの値は、反転されると、2進数で、
「-0b1000」と表され、
10進数では、「-8」となりますね。
xの値「0b111」は10進数で表すと7なので、
-(x + 1)に当てはまっていることが分かりますね。
左シフト
こちらのコードを見てみましょう。
x = 0b0111
y = x << 2
print(bin(y))
2行目にある内容は、何を示しているか分かりますか?
あえて、出力を2進数にしたのは、内容をより理解してもらうためです。
出力結果は、「0b011100」となれば正解です。
xの値の右側の桁に、0が2つ追加されましたね。
これは、2行目で、xの値に「<< 2」の次に入力したことが影響しています。
「x << 2」は、
2桁分xの値の右側に0を追加するといった意味になります。
一般化すると、
「x << 〇」は、
〇桁分xの値の右側に0を追加する、となります。
xの値はこの操作によって左側にずれるので、左シフトと呼ばれているわけです。
上のコードでは、この説明を分かりやすくするために2進数で出力しましたが、
必要に応じて10進数で出力するようにしてください。
右シフト
x = 0b0111
y = x >> 2
print(bin(y))
右シフトの演算子の表現は、左シフトの逆バージョンです。
左シフトでは、右側の桁に0が追加されていきましたが、
右シフトでは、右側の桁から値が消されていきます。
上のコードを出力すると、
「0b01」と出てくると思いますが、
2桁分右側から消されたことが分かると思います。
「x >> 〇」とした場合、
〇の桁数分、右側にある値が消え、左側にある残りの値が右へシフトしていくということです。
まとめ
今回は、2進数を扱う際に使用するビット演算子を学習しました。
なぜこのようなことを知っておく必要があるのかは、この先学習を進めると分かってくると思いますが、長いコードを書かなければならないときに少しでもコードの量を少なくし、よりコンパクトで分かりやすいコードの入力ができるようになるための積み上げだと思って下さい。
最後に今回登場したビット演算子の種類とその活用法をもう一度復習し、知識としてインプットしておきましょう。
GitHubでの閲覧方法は次の記事を参考にしてください。
それではまた次回お会いしましょう。
おぎー