【问题标题】:Two's complement function outputs wrong result for -1二进制补码函数为 -1 输出错误结果
【发布时间】:2019-01-13 23:29:39
【问题描述】:

我正在为 FPGA 程序生成输入以使用梯形积分方法。基本上,这里感兴趣的函数是invert()twos_comp() 函数;剩下的只是测试(创建一个方波信号,然后迭代并将其转换为二进制补码)。

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)

这里的问题是,这会将 1 的二进制补码输出为 01111111,而不是 1111111。invert() 的输出似乎是正确的,正数的 twos_comp() 的输出似乎是正确的,并且生成信号似乎也是正确的,所以我认为它必须与线路有关

return format(int(invert(bin_val),2) + int('1', 2), '08b')

但是在 SO 和谷歌上环顾四周,这是其他人处理二进制添加的方式。

请注意,twos_comp() 的所有输入均为 8 位。关于为什么这不起作用的任何帮助将不胜感激。没有完全错误,只是输出不正确。

您可以运行代码here

【问题讨论】:

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


    【解决方案1】:

    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
    

    如果您想要一个 hacky 解决方案(我怀疑您会这样做,因为您已经在字符串和数字之间来回切换),只需执行以下操作:

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

    这对正数和负数都有效。

    【讨论】:

    • 啊……这样就行了。是的,这很 hacky,我正在尝试快速将其组合在一起以测试其他一些代码。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2021-02-24
    • 2012-11-23
    • 2014-11-15
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多