[英]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.