微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 python 中计算两个有符号 64 位整数之间的 XOR 时的意外行为

如何解决在 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 运算符的,以及如何更改我的函数以使其按照我希望的方式工作?

解决方法

实际上,误导的是bin函数:
它不显示实际存储的二进制值,而是显示 |x| (绝对值)并在其前面打印负号。

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

XOR 对存储在 two's compliment 中的实际二进制值进行运算,这就是为什么您得到比预期更大的位差的原因。

举个简单的例子,我们以两个 4 位数字为例:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。