python - 在 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 对存储在二进制补码中的实际二进制值进行运算,这就是为什么您的位差比您预期的要大。
作为一个简单的例子,让我们取两个 4 位数字:
-10 = 0b0110
-11 = 0b0101
^ = 0b0011
如您所见,在此表示中,这两个数字之间有两位差异,而如果它们是正数,则只有一位差异。
推荐阅读
- javascript - 在 React 中的按键上应用按钮“活动”样式
- angular - 键值角5打字稿的数据结构
- php - 在 Laravel 集合中用逗号连接字符串
- java - 如何通过正确的翻译放大鼠标位置
- javascript - jquery ui可拖动位置相对不起作用
- rest - 其余内容未出现在 Xamarin.forms 示例中
- android - 共享元素过渡,包括 CollapsingToolbarLayout
- javascript - 为什么我不能在 JavaScript 中使用 "x = $("p").offset; Top = x().top"?
- javascript - 如何从本地目录加载图像作为反应道具?
- angular - 冲突 materialize-css 和 @angular/material 主题