异或的补码
什么是找到 ~A XOR B 最有效的算法?(注意,~ 是取反函数,它的作用是把每个1变成0,把每个0变成1,而 XOR 是一种特殊的“或”运算)
举个例子,~4 XOR 6 = ~010 = 101 = 5,而 ~6 XOR 9 = ~1111 = 0
3 个回答
-1
你可以简单地使用 == 来比较。
A 和 B 之间的 XNOR 运算和 == 操作符是一样的,原因如下:
A B NXOR
假设 F 代表假,T 代表真
F F T
F T F
T F F
T T T
1
这里唯一的问题是,~
对于正数输入会返回一个负数,而你想要的是一个正数结果,并且这个结果只包含输入中重要的位。
下面是一个可以生成所需结果位掩码的函数:
def mask(n):
n = abs(n)
shift = 1
while n & (n + 1) != 0:
n |= n >> shift
shift *= 2
return n
接下来是如何使用这个函数:
print (~a ^ b) & mask(a | b)
5
这里有一个答案,考虑到了存储整数所需的位数:
def xnor(a, b):
length = max(a.bit_length(), b.bit_length())
return (~a ^ b) & ((1 << length) - 1)
不过,我想不出有什么情况会比直接用 ~a ^ b
更好。而且对于负数来说,这几乎肯定是没有意义的。