二进制补码输出错误结果为-1

时间:2018-08-07 00:21:15

标签: python python-3.x binary twos-complement 8-bit

我正在生成一个使用梯形积分方法的FPGA程序的输入。基本上,这里关注的功能是Sub RunoutDateLoop() Dim r As Long, c As Long Dim Found As Boolean r = 8 Do Until IsEmpty(Cells(r, 1)) c = 24 Do Until IsEmpty(Cells(r, c)) If Cells(r, c).Value < 1 Then Cells(r, 18).Value = Cells(7, c) Found = True Exit Do 'Exit the inner do Else Cells(r, 18).Value = Cells(7, c) End If c = c + 1 Loop r = r + 1 Loop End Sub invert()函数;其余的只是测试(创建方波信号,然后迭代并转换为二进制补码)。

twos_comp()

这里的问题是,它输出1的二进制补码为01111111,而不是1111111。signals = [] bit_signals = [] def invert(bit_val): new_val = [] for i in bit_val: new_val.append(str(int(not(int(i))))) return ''.join(new_val) def twos_comp(val): if val < 0: bin_val = format(val, '08b')[1:] return format(int(invert(bin_val),2) + int('1', 2), '08b') else: bin_val = format(val, '08b')[1:] return bin_val x = 0 signal = 1 while x <= 25: if x % 2 == 0: signal*=-1 signals.append(signal) x+=1 print(signals) for i in signals: bit_signals.append(twos_comp(i)) print(bit_signals) 的输出似乎是正确的,正数的invert()的输出似乎是正确的,而且信号的产生似乎也是正确的,所以我认为这一定与线路有关

twos_comp()

但是在SO和google上四处看看,这就是其他人处理二进制文件添加的方式。

请注意,return format(int(invert(bin_val),2) + int('1', 2), '08b') 的所有输入均为8位。任何帮助将不胜感激,为什么这是行不通的。没有彻底的错误,只有错误的输出。

您可以运行代码here

1 个答案:

答案 0 :(得分:3)

val-1时逐步查找值:

>>> format(-1, '08b')
'-0000001'

您可能已经发现了错误-08b表示8个字符宽,而不是8位数字。对于负数,-占用1个字符,因此您只能得到8位数字。但是如果不清楚为什么会出现问题,让我们继续:

>>> format(val, '08b')[1:]
'0000001'
>>> invert('0000001')
'1111110'
>>> int(invert('0000001'), 2)
126
>>> int('1', 2) # BTW, why do you need this instead of just 1, exactly?
1
>>> 126 + 1
127
>>> format(127, '08b')
01111111

如果您想要一个可靠的解决方案(并且我怀疑您这样做,因为您已经在整个地方在字符串和数字之间来回移动了),只需执行以下操作:

bin_val = format(val, '09b')[-8:]

这对正数和负数都适用。