计算 python 中两个带符号的 64 位整数之间的 XOR 时出现意外行为
Unexpected behavior when computing the XOR between two signed 64-bit integers in python
我需要计算两个整数之间的汉明距离,方法是计算它们的二进制表示之间的不同位数。
这是我为此目的使用的函数:
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。
但是,函数的 returned 汉明距离是 3,我似乎不明白为什么。
当我将这两个数字之间的 XOR 计算为 a ^ b returns 7(因此计算 3 个“1”位)时出现问题,而我期望它是 return 1(并计数 1 个“1”位)。
我认为这与 XOR 值似乎被存储为具有最少可能位数的无符号整数这一事实有关,而我需要将其存储为
我怎么会误解 XOR 运算符以及如何更改我的函数以按我希望的方式工作?
实际上,误导的是bin
函数:
它不显示存储的实际二进制值,而是显示 |x| (绝对值)并在其前面打印负号表示负数。
但是,这并不是实际存储值的方式。
XOR 对存储在 two's compliment 中的实际二进制值进行运算,这就是为什么您得到比预期更大的位差的原因。
作为一个简单的例子,让我们取两个 4 位数:
-10 = 0b0110
-11 = 0b0101
^ = 0b0011
如您所见,在这种表示中,这两个数字之间有两位的差异,而如果它们是正数,则只有一位的差异。
我需要计算两个整数之间的汉明距离,方法是计算它们的二进制表示之间的不同位数。
这是我为此目的使用的函数:
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。 但是,函数的 returned 汉明距离是 3,我似乎不明白为什么。
当我将这两个数字之间的 XOR 计算为 a ^ b returns 7(因此计算 3 个“1”位)时出现问题,而我期望它是 return 1(并计数 1 个“1”位)。
我认为这与 XOR 值似乎被存储为具有最少可能位数的无符号整数这一事实有关,而我需要将其存储为
我怎么会误解 XOR 运算符以及如何更改我的函数以按我希望的方式工作?
实际上,误导的是bin
函数:
它不显示存储的实际二进制值,而是显示 |x| (绝对值)并在其前面打印负号表示负数。
但是,这并不是实际存储值的方式。
XOR 对存储在 two's compliment 中的实际二进制值进行运算,这就是为什么您得到比预期更大的位差的原因。
作为一个简单的例子,让我们取两个 4 位数:
-10 = 0b0110
-11 = 0b0101
^ = 0b0011
如您所见,在这种表示中,这两个数字之间有两位的差异,而如果它们是正数,则只有一位的差异。