第80回【Python】半加算器、全加算器、論理演算を用いた計算のまとめ
現在取り組んでいるのは、paiza ラーニング問題集「論理演算メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 80 回目です。
早くも「論理演算メニュー」の最終回です。とても簡単だけれど、奥が深い。上手に使えばコードを簡略化できる。ただ、一緒に作業している人がちゃんと理解できるかどうかは別問題。
それでは、今日も頑張ってみようと思います。
半加算器
京子ちゃんは 二進数 1 けたの整数 A と B を使って、 A + B
を計算したいと思っています。
上記の画像のように、 A と B を足した結果 (2 進表記) の下から 2 けた目の値を C 、下から 1 けた目の値を S とします。 C と S を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ A, B は 0 または 1
0 0
半加算器は、AND と XOR の組み合わせ、で覚えよう。C 言語をやったときに、なんのヒントも貰えずに、頭を抱えた記憶があるなぁ。
※ヒント 真理値表を書いてみると、すぐに理解できると思います。
Python
A,B = map(int,input().split())
C = A & B
S = A ^ B
print(C,S)
VBA
AB = Split(Cells(1, 1), " ")
A = Val(AB(0))
B = Val(AB(1))
C = A And B
S = A Xor B
Debug.Print C & " " & S
全加算器
京子ちゃんは 二進数 の整数同士で足し算をするプログラムを作成したいと思っています。
二進数の足し算において、下から 1 けた目の計算は半加算器でできることを知り、 2 けた目の計算も同じように足し算ができないかと考えています。
上記の画像のように、 現在下から 2, 3 けた目を計算しようとしています。そこで、入力 A, B と 1 けた目からの繰り上がり C1 が与えられます。 京子ちゃんに変わって C2 と S を計算し、出力してください。
この問題は少し難しいので、ヒントとなる画像を用意しました。 2 つの半加算器と XOR 演算を用いることで計算することができます。
すべてのテストケースにおいて、以下の条件をみたします。
・ A, B, C1 は 0 または 1
0 1 1
半加算器があるなら全加算器もある。ヒントがあっても分かりづらい。ひとつずつ解いていけば答えは導かれる、はず。
Python
A,B,C1 = map(int,input().split())
def half(a,b):
c = a & b
s = a ^ b
return c,s
Cx,Sy = half(A,B)
Cy,S = half(Sy,C1)
C2 = Cx ^ Cy
print(C2,S)
VBA
Private Sub basic_step9()
ABC = Split(Cells(1, 1), " ")
a = Val(ABC(0))
b = Val(ABC(1))
C1 = Val(ABC(2))
CxSy = half(a, b)
CyS = half(CxSy(1), C1)
C2 = CxSy(0) Xor CyS(0)
Debug.Print C2 & " " & CyS(1)
End Sub
Private Function half(a, b)
C = a And b
S = a Xor b
half = Array(C, S)
End Function
論理演算を用いた計算のまとめ
0 または 1 の整数 A, B, C, D が与えられます。 以下の式を計算した結果を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ A, B, C, D は 0 または 1
0 0 0 0
全部書いてある通りに繋いでいけばいい。もしくは、ド・モルガンしちゃう?
Python
A,B,C,D = map(int,input().split())
print(int(not(not(A) and not(B) or not(C)) ^ D))
Python(ド・モルガン使用)
A,B,C,D = map(int,input().split())
print(((A or B) and C) ^ D)
VBA
ABCD = Split(Cells(1, 1), " ")
a = CBool(ABCD(0))
b = CBool(ABCD(1))
c = CBool(ABCD(2))
d = CBool(ABCD(3))
Debug.Print CInt(Not ((Not (a) And Not (b)) Or Not (c)) Xor d) * -1
VBA(ド・モルガン使用)
ABCD = Split(Cells(1, 1), " ")
a = Val(ABCD(0))
b = Val(ABCD(1))
c = Val(ABCD(2))
d = Val(ABCD(3))
Debug.Print ((a Or b) And c) Xor d
最後に
ド・モルガンについては、各自お調べください。not で抑えつけられたら、真ん中突き破るんだけど、and が or に or が and にひっくり返る。くらいがわかればすぐに理解できると思われます。それ以外もいろいろとありますが。
論理演算メニューを駆け足で進めましたが、しっかり理解しておく必要はあると思います。プログラミングって結局のところ、論理的思考でパズルを解くようなものだと思っているので。
次回からは「データセット選択メニュー」に挑戦します。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません