[英]How do I compare two numbers in python(and, or, xor)?
我是編程新手,我正在嘗試為以下練習找到 python 解決方案:
我需要比較所附圖像中 3 個案例的 2 個數字的二進制形式(AND、OR、XOR)。Bellow 是我的代碼,但我不知道如何使其適用於所有 3 個案例。 謝謝!
a,b = int(input("Please enter the first number: ")),int(input("Please enter the second number: "))
m = ""
n = ""
p = ""
print(sep="\n")
print(bin(a),bin(b),sep="\n")
print(sep="\n")
length = max([len(bin(a)), len(bin(b))])-2
# AND
for i in range(length):
if bin(a)[-1]== "1" and bin(b)[-1]== "1":
m+= "1"
else:
m+= "0"
a = a >> 1
b = b >> 1
print ("0b" + m[::-1],"| AND")
#OR
for i in range(length):
if bin(a)[-1]== "1" or bin(b)[-1]== "1":
n+= "1"
else:
n+= "0"
a = a >> 1
b = b >> 1
print ("0b" + n[::-1],"| OR")
#XOR
for i in range(length):
if bin(a)[-1] != bin(b)[-1] :
p+= "1"
else:
p+= "0"
a = a >> 1
b = b >> 1
print ("0b" + p[::-1],"| XOR")
問題是第一個循環修改了輸入變量a
和b
並將它們保留為零。 這意味着第二個和第三個循環沒有任何用處。
解決此問題的最簡單方法是將每個循環放在一個單獨的函數中,該函數無法修改傳入的值,因此它們將自動恢復。
我寫了一個很長的答案,因為我希望在我第一次學習 Python 時有人有。 請注意,我非常刻意地完成了所有步驟,並且沒有提供所有內容的最終代碼。 對不起,如果它進行得太慢:我試圖清楚,而不是光顧。 請注意,您的代碼的“問題”僅僅是使用位移來修改 a 和 b。
這段代碼中有很多“有趣”的做事方式,可能值得考慮以下“標准”解決方案:
print(sep="\n")
這根本沒有任何作用,因為sep
僅在有多個條目時才應用。 比較一下:
print("hello", "world", sep="\n")
你能看到sep
做了什么嗎? 此行執行您認為的操作的原因是end
的默認值也是\\n
。 要打印空行,您可以使用print(end="\\n")
,它等效於print()
,因此首選后一種形式。
在位級別比較兩個數字的最簡單方法是使用按位運算:
a = 0b11110000
b = 0b10101010
a & b # and
對於其他按位運算符,請參閱:
https://wiki.python.org/moin/BitwiseOperators
手動按位問題可以被認為是“按數字迭代數字並在數字上做一些事情”。 您已經對第一個問題有了很好的解決方案:使用bin()
獲取字符串並對其進行迭代。 但是你有一些范式在起作用,包括使用<<
來轉換,正如@MarkRansom 指出的那樣,它正在修改你的整數。 采用單一迭代范式會更“標准”。 天真:
a = bin(0b11110000)
b = bin(0b10101010)
for i in range(len(a):
a_digit = int(a[i])
b_digit = int(b[i])
# comparison here
但更慣用的是:
for a_digit, b_digit in zip(a, b):
comparison(int(a_digit), int(b_digit))
以“and”的情況為例,因為它是最簡單的(我將其他比較留給您),因此測試顯然是a_digit == 1 and b_digit == 1
。 所以我們會寫:
res = []
for a_digit, b_digit in zip(a,b):
res.append(int(a_digit) == 1 and int(b_digit == 1))
# res = [True, True, True, True, False, False, False, False]
但是記住1
在 python 中是真的,更好的是:
res.append(int(a_digit) and int(b_digit))
如果我們想要 1 和 0:
res.append(1 if int(a_digit) and int(b_digit) else 0)
在這一點上,我們准備將它全部包裝成一個列表推導式:
res = [1 if int(a_digit) and int(b_digit) else 0 for a_digit, b_digit in zip(a,b)]
這個范式真的很值得學習。 listcomp 可能是“手動”解決這些問題的最正常方法,我在這里遵循的步驟可以用於其他情況(或 xor、nand 等)。
def decimalToBinary(n):
return bin(n).replace("0b", "")
## Uncomment the below two lines of code, if you are inputting the numbers in decimal format
# bin_a = str(decimalToBinary(int(input("Enter first number: "))))
# bin_b = str(decimalToBinary(int(input("Enter second number: "))))
## Uncomment the below two lines of code, if you are inputting the numbers in binary format
# bin_a = str(int(input("Enter first number: ")))
# bin_b = str(int(input("Enter second number: ")))
len_bin_a = len(bin_a)
len_bin_b = len(bin_b)
if len_bin_a > len_bin_b:
bin_b = "0" * (len_bin_a - len_bin_b) + bin_b
elif len_bin_a < len_bin_b:
bin_a = "0" * (len_bin_b - len_bin_a) + bin_a
or_result = "".join([str(int(bin_a[i]) | int(bin_b[i])) for i in range(len(bin_a))])
and_result = "".join([str(int(bin_a[i]) & int(bin_b[i])) for i in range(len(bin_a))])
xor_result = "".join([str(int(bin_a[i]) ^ int(bin_b[i])) for i in range(len(bin_a))])
print(or_result + "\tOR")
print(and_result + "\tAND")
print(xor_result + "\tXOR")
如果你想深入了解 Python 中的位運算符,我會在下面留下一個鏈接
https://www.geeksforgeeks.org/python-bitwise-operators/
希望代碼可以達到目的
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.