【问题标题】:Unsigned ints of arbitrary length in pythonpython中任意长度的无符号整数
【发布时间】:2018-12-05 06:55:49
【问题描述】:

我正在尝试模拟定点滤波器的实现。我想捕获低级硬件功能,例如 2s 补码环绕/溢出和固定寄存器宽度。一些寄存器宽度由硬件功能设置为异常和长宽度(即 72b)。

我在使用内置整数方面取得了一些进展。无限宽度非常有用......但我发现自己经常与 Python 作斗争,因为它有时想将二进制解释为正整数,有时它似乎想将非常相似的二进制解释为负 2 的补码。例如:

>> a = 0b11111                          # sign-extended -1
>> b = 0b0011
>> print("{0:b}".format(a*b))
5f
>> print("{0:b}".format((a*b)&a))       # Truncate to correct product length
11101                                   # == -3 in 2s complement. Great!
>> print("{0:b}".format(~((a*b)&a)+1))  # Actually perform the 2's complement
-11101                                  # Arrrrggggghhh
>> print("{0:b}".format((~((a*b)&a)&a)+1))  # Truncate with extreme prejudice
11                                          # OK. Fine.

我想如果我足够努力地思考,我可以弄清楚为什么所有这些都以它的方式工作,但如果我可以在无符号空间中完成所有操作而不用担心 python 添加符号位,它会让事情变得更容易,错误更少 -易于。任何人都知道是否有一种相对简单的方法可以做到这一点?我考虑过位字符串,但我必须在这个应用程序中做很多加法和乘法运算,内置的整数运算对此非常有用。

【问题讨论】:

  • 你期望 ~29 是什么,为什么?

标签: python integer unsigned twos-complement fixed-point


【解决方案1】:

~x 在任意精度整数上按字面意思定义为-(x+1)。它进行位运算:~0 是一字节整数的255,两字节整数的65535,10 位整数的 1023 等等;所以定义~ 通过对弹性整数的位反转是没有用的。

如果a 定义整数的固定宽度(0b11111 表示您正在处理五位数字),则位反转就像a^x 一样简单。

print("{0:b}".format(a ^ b)
# => 11100

Two 的补码同时最简单的方法是 a+1-b,或者等价的 a^b+1

print("{0:b}".format((a + 1) - b))
# => 11101
print("{0:b}".format((a ^ b) + 1))
# => 11101

tl;dr:如果您想保持未签名状态,请不要使用 ~

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2012-11-27
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多