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)
パイプ|
を0
と1
ではさんだ演算となりますが、出力結果は次のようになります。
論理和
0
1
1
1
出力結果を見るとわかりますが、|
を挟んでいる数字のうち、どちらかに1
が入っていれば出力が1
になっています。
論理積
次は、論理積ですが、こちらは&
(アンパサンド)を1
と0
で挟みます。
print('論理積')
print(0 & 0)
print(0 & 1)
print(1 & 0)
print(1 & 1)
論理積は、論理和と違い、どちらかに0
が入っていると出力結果が0
になります。
論理積
0
0
0
1
普通の掛け算でも0
を掛けると0
になるのと同じですね。
排他的論理和
ぴお排他的論理和は、^
を0
と1
ではさんだ演算mになります。
print('排他的論理和')
print(0 ^ 0)
print(0 ^ 1)
print(1 ^ 0)
print(1 ^ 1)
排他的論理和は、どちらも同じ数字の場合は0
を返し、違う場合は1
を返します。
排他的論理和
0
1
1
0
反転
反転は、0
と1
で~
で挟んで使いますが、出力結果は、マイナスを付けて0
を1
にしたり、マイナスを付けて1
を0
にします。
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行目の出力は、1
に1
を足して桁が上がって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アドレスに関する値を取得する際にこうやって使うなんて説明がされていましたが、理解するのにかなり時間がかかりました。
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!