Python ビット演算

Python学習【365日チャレンジ!】297日目のマスターU(@Udemy11)です。

株式優待を期待して、株を取得したにも関わらず、なかなか株主優待が届かないんです。

もしかして株主優待の権利を取得できてなかったのかな?

なんて考えて、改めて株の取得日と権利確定日をチェックしてみると、株の取得日が株主優待の権利確定日の次の日だったことが判明し、ものすごく落ち込んでしまいました。

まー、株価が上がって含み益があるので、とりあえず良しとしますが、株主優待の権利確定日はきちんとチェックしておかないといけませんね。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、json.dumpsについて学習しました。

json.dumpは、pprintと同じように、取得した値の出力を見やすく整形できました。

pprintと違い、細かい引数を指定しなくてもindentを指定すれば、階層ごとに改行して人が見やすい出力結果を表示することができました。

詳しいことは、昨日の記事をごらんください。

今日は、ビット演算の論理和・論理積・排他的論理和・反転・シフトを学習します。

論理和

ビット演算は実践で使うことはほとんどないそうなので、覚える必要はないかもしれませんが、プログラミングを学習する上で、ひととおり習っておく必要があるということで、サラッと学習したいと思います。

まずは論理和です。

print('論理和')
print(0 | 0)
print(0 | 1)
print(1 | 0)
print(1 | 1)

パイプ|01ではさんだ演算となりますが、出力結果は次のようになります。

論理和
0
1
1
1

出力結果を見るとわかりますが、|を挟んでいる数字のうち、どちらかに1が入っていれば出力が1になっています。

論理積

次は、論理積ですが、こちらは&(アンパサンド)を10で挟みます。

print('論理積')
print(0 & 0)
print(0 & 1)
print(1 & 0)
print(1 & 1)

論理積は、論理和と違い、どちらかに0が入っていると出力結果が0になります。

論理積
0
0
0
1

普通の掛け算でも0を掛けると0になるのと同じですね。

排他的論理和

ぴお排他的論理和は、^01ではさんだ演算mになります。

print('排他的論理和')
print(0 ^ 0)
print(0 ^ 1)
print(1 ^ 0)
print(1 ^ 1)

排他的論理和は、どちらも同じ数字の場合は0を返し、違う場合は1を返します。

排他的論理和
0
1
1
0

反転

反転は、01~で挟んで使いますが、出力結果は、マイナスを付けて01にしたり、マイナスを付けて10にします。

print('反転')
print(0)
print(~0)
print(1)
print(~1)

出力結果

反転
0
-1
1
-2

反転は、1を足してマイナスをつけているのですが、bit(2進数)で表示したほうがわかりやすいので、bitで出力してみます。

print('反転')
print(bin(0))
print(bin(~0))
print(bin(1))
print(bin(~1))

出力結果

反転
0b0
-0b1
0b1
-0b10

bit表示でみるとわかるのですが、5行目の出力は、11を足して桁が上がって10になってマイナスをつけているので、1を足してマイナスをつけていることがわかるかと思います。

ちなみに、~を2回つけて~~0とすると、結果は元の0になります。

シフト

シフトは<<をつけてシフトする数を右に書きます。

print('シフト')
print(bin(1 << 0))
print(bin(1 << 1))
print(bin(1 << 2))
print(bin(1 << 3))

出力結果

シフト
0b1
0b10
0b100
0b1000

2進数で表示していますが、出力結果を10進数で考えると、1,2,4,8になるので、シフトしている数だけ倍にしてしていることになります。

また、コードの5行目をprint(bin(1 << 3 >> 2))とすると、3桁シフトしたあと、2桁戻すことになるので、出力結果は3行目のprint(bin(1 << 1))と同じ0b10になります。

次に最初の数字を1ではなく5にしてbin(5)を出力すると0b101となりますが、bin(5 >> 1)を出力すると、1桁下がって1が切り捨てられて0b10になります。

まとめ

さらっと流しただけでは全くもってなんのことやら理解できていませんが、とりあえず、こんな論理演算があるということはわかったかと思います。

酒井さんのレクチャーでは、IPアドレスに関する値を取得する際にこうやって使うなんて説明がされていましたが、理解するのにかなり時間がかかりました。

Udemy講師 酒井さん プログラミング Python

IPアドレスとサブネットマスクの論理積はIPアドレスになるという解説だったのですが、192 & 255, 168 & 255, 1 & 255, 10 & 0を出力すると192 168 1 10になるということをサラッと流されているので、ちょっとちんぷんかんぷん。

コンピューターは2進数で計算されているので、10進数の192は、2進数で11000000で、10進数の255は2進数で11111111となるので、その論理積は、11000000となり、最初の論理積の出力は、192になると解説されていると理解できたかもしれませんが、私は理解するのにかなり時間がかかりました。。

このような解説がないため、理解に時間がかかってしまいますが、自分で答えを見つけられると、ちょっとうれしくなるんですよね。

そんな小さな発見を楽しみながら、Pythonを学習しましょう。

それでは、明日もGood Python!