【发布时间】:2021-01-20 14:01:43
【问题描述】:
我正在读取一些偏移二进制格式的二进制数据。 numpy 中的有符号整数是二进制补码,因此值不正确。要修复数据,我需要翻转最重要的位。但是,我从按位异或得到了一些意想不到的结果,并且不完全确定发生了什么。
例子:
data = np.array([1, 7, -1, -8], dtype='i1')
mask = 0b10000000
def print_bin(data, out):
for d, o in zip(data, out):
bin_data =np.binary_repr(d, d.dtype.itemsize*8)
bin_out = np.binary_repr(o, o.dtype.itemsize*8)
print(f'{bin_data} to {bin_out}')
print_bin(data, data ^ mask)
输出:
00000001 to 0000000010000001
00000111 to 0000000010000111
11111111 to 1111111101111111
11111000 to 1111111101111000
似乎numpy 可能在 xor 之前进行某种类型的转换,因为输出是 16 位整数。如果我使用函数形式 np.bitwise_xor 而不是 ^ 我会得到相同的结果。有趣的是,如果我用-mask 进行异或运算,结果是正确的。或者,如果我以函数形式指定 dtype。
print_bin(data, np.bitwise_xor(data, mask, dtype='i1'))
print_bin(data, data ^ -mask)
输出:
00000001 to 10000001
00000111 to 10000111
11111111 to 01111111
11111000 to 01111000
谁能准确解释第一种情况发生了什么?
【问题讨论】: