python中任意长度的无符号int



我正在尝试模拟一个定点过滤器实现。我想捕获底层硬件功能,如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添加符号位,这将使事情变得更容易,也不容易出错。有人知道有没有相对简单的方法吗?我考虑过比特串,但我必须做很多加法&在这个应用程序中进行乘法运算,内置的整数运算非常有用。

~x在任意精度整数上被定义为-(x+1)。它做而不是做位算术:~0是一字节整数中的25565535是两字节整数,1023是10位整数等;因此通过对可拉伸整数的位反转来定义CCD_ 6是无用的。

如果a定义了整数的固定宽度(0b11111表示您使用的是五位数字(,则位反转与a^x一样简单。

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

同时,二的补码最容易作为a+1-b或等效的a^b+1:来完成

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

tl;dr:如果你想保持未签名,就不要使用~

最新更新