两个';Python中的s补码算法

两个';Python中的s补码算法,python,Python,我必须对3D曲面进行2的补码转换,每个元素代表12位2的补码 为了转换数组,我有以下代码: 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 << (bit

我必须对3D曲面进行2的补码转换,每个元素代表12位2的补码

为了转换数组,我有以下代码:

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
但同样,数据看起来并不“正确”。有什么建议吗

谢谢

我所说的“不对”是指我期望的曲面


但是,我得到的曲面看起来是这样的(还有一个80的乘数,这解释了为什么z轴上的数字如此之大)

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

在这里:


使用这个简单的函数

def twos_comp(val):
    return 0b111111111111 - val       # 12 ones
你可以试一下

val = 0b111100001111
print("{:012b}".format(twos_comp(val)))
你会得到

00001110000

如果不是您想要的,请使用此函数

def twos_comp(val):
    return 0b1000000000000 - val      # 1 with 12 zeroes

你所说的“毫无意义”和“看起来不对劲”是什么意思。你能分享一些样品并说明退回的和应该退回的吗?简言之,a会有很大帮助:)谢谢,我已经阅读了其中的大部分,这就是我获得现有代码的来源。
np.nditer(数组,op_标志=['readwrite'])
做了我认为它做的事情吗?也就是通过数组的每个元素循环,通过循环中代码的结果更新值谢谢,我想这已经得到了。你知道为什么我会对我的期望持否定态度吗?
def twos_comp(val):
    return 0b1000000000000 - val      # 1 with 12 zeroes