Python中的Two's补码算法

时间:2017-06-22 20:37:34

标签: python

我必须对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

但数据再次看起来并不“正确”。有什么建议吗?

由于

“不对”我的意思是我期待一个看起来像的表面 expected surface

但是,相反,我得到的表面看起来像resultant surface(还有一个80的乘数,可以解释为什么z轴上的数字太大了)

2 个答案:

答案 0 :(得分:0)

这里已经提供了一些相关内容:

Python - Most effective way to implement two's complement?

在这里:

Two's Complement in Python

答案 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