首页 > 解决方案 > 在 python 中计算两个有符号 64 位整数之间的 XOR 时出现意外行为

问题描述

我需要通过计算它们的二进制表示之间的不同位数来计算两个整数之间的汉明距离。

这是我为此目的使用的功能:

def hamming(a, b):
    # compute and return the Hamming distance between the integers
    return bin(int(a) ^ int(b)).count("1")

我开始对这个功能进行一些简单的测试,以确保它正常工作,但几乎立即我发现它没有,我试图理解为什么。

我用这两个数字测试了这个函数:

a = -1704441252336819740
b = -1704441252336819741

python给出的这些数字的二进制表示是:

bin(a): -0b10111 10100111 01100100 01001001 11011010 00001110 11011110 00011100 
bin(b): -0b10111 10100111 01100100 01001001 11011010 00001110 11011110 00011101

正如您所看到的,除了第一个数字外,它们的二进制表示是相同的,因此汉明距离应该是 1。但是,从函数返回的汉明距离是 3,我似乎无法理解为什么。

当我计算这两个数字之间的 XOR 时出现问题,因为 a ^ b 返回 7(因此计算 3 个“1”位),而我希望它返回 1(并计算 1 个“1”位)。

我相信这与 XOR 值似乎被存储为具有最少可能位数的无符号整数这一事实有关,而我需要将其存储为

我如何误解 XOR 运算符,如何更改我的函数以按照我想要的方式工作?

标签: pythonbitwise-operatorsxor

解决方案


实际上,这是一个bin具有误导性的函数:
它没有显示存储的实际二进制值,而是显示 |x| (绝对值)并在其前面打印负号以表示负数。

但是,这不是实际存储值的方式。

XOR 对存储在二进制补码中的实际二进制值进行运算这就是为什么您的位差比您预期的要大。

作为一个简单的例子,让我们取两个 4 位数字:

-10 = 0b0110
-11 = 0b0101
  ^ = 0b0011

如您所见,在此表示中,这两个数字之间有两位差异,而如果它们是正数,则只有一位差异。


推荐阅读