簡體   English   中英

如何比較python(和,或,異或)中的兩個數字?

[英]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")

問題是第一個循環修改了輸入變量ab並將它們保留為零。 這意味着第二個和第三個循環沒有任何用處。

解決此問題的最簡單方法是將每個循環放在一個單獨的函數中,該函數無法修改傳入的值,因此它們將自動恢復。

我寫了一個很長的答案,因為我希望在第一次學習 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM