我必须对3D表面进行二进制补码转换,每个元素代表一个12位二进制补码。
为了转换数组,我有以下代码:
for x in np.nditer(array, op_flags=['readwrite']):
x[...] = twos_comp(x, 12)
我在网上找到了以下功能:
def twos_comp(val, bits):
"""compute the 2's complement of int value val"""
if (val & (1 << (bits - 1))) != 0: # if sign bit is set e.g., 8bit: 128-255
val = val - (1 << bits) # compute negative value
return val
但是,我得到的结果没有任何意义。我的代码错了吗?
我尝试的另一件事是:
for x in np.nditer(array, op_flags=['readwrite']):
if x > 2047:
x[...] = (2047 - x)
else:
x[...] = x
但数据再次看起来并不“正确”。有什么建议吗?
由于
答案 0 :(得分:0)
答案 1 :(得分:0)
使用这个简单的功能
def twos_comp(val):
return 0b111111111111 - val # 12 ones
您可以使用
进行测试val = 0b111100001111
print("{:012b}".format(twos_comp(val)))
你会得到
000011110000
如果不是您想要的,请改用此功能
def twos_comp(val):
return 0b1000000000000 - val # 1 with 12 zeroes