异或的补码

1 投票
3 回答
1219 浏览
提问于 2025-04-18 13:28

什么是找到 ~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 更好。而且对于负数来说,这几乎肯定是没有意义的。

撰写回答