Python中的位运算操作

4
我正在寻求在Python中执行位运算的建议。
我遇到的主要问题是Python的位运算符具有无限精度,这意味着-1实际上是“111.......111”。这不是我想要的。我想模拟真正的硬件,它将具有一些固定的精度,比如32位。
以下是一些需要注意的事项:
1)-n应返回一个32位的二进制补码数(这可以通过获取无限精度的-n的低32位轻松实现)
2)n >> 3应该是32位数字的算术右移,这意味着如果位31为'1',则在向右移3位后,位31:28应为'1'。

1
你可以使用numpy,它内置了int32类型。http://docs.scipy.org/doc/numpy-1.5.x/reference/arrays.scalars.html - GWW
GWW:我正准备把这个作为答案发布。也许你想自己把它作为答案呈现? - Sven Marnach
1
@Sven Marnach:当然可以发布,谢谢。我不确定他是否想使用外部库。 - GWW
谢谢您的建议。理想情况下,我希望能够使用任意大小的整数,而不仅仅是限于32位、64位等。如果32位精度不是必需的话,硬件很可能会有小于32位的整数。 - Himadri Choudhury
@DasBoot:当你说你想要一个二进制补码数字时,这意味着你想要使用负整数,对吗? - GWW
是的,我也想使用负整数。你的numpy想法似乎对于标准大小(8、16、32等)可以很好地工作,但我还想指定一些精度,比如20。 - Himadri Choudhury
2个回答

6
你可以使用numpy,它内置了int32类型和更多功能。

3

在进行任何操作之前,您可以始终添加& ((1<<32) - 1)掩码来限制数字为32位,例如:

class Int32(int):
    def __neg__(self):
        return Int32(int.__neg__(self) & ((1 << 32) - 1))
    def __rshift__(self, other):
        if self & (-1 << 31):
             retval = int.__rshift__(int.__sub__(self, 1<<32), other)
             return Int32(retval & ((1 << 32) - 1))
        else:
             return Int32(int.__rshift__(self, other))
    ...

>>> -Int32(5)
4294967291
>>> (-Int32(5)) >> 1
4294967293

这对于 >> 操作符来说不太适用,对吧?在某些情况下它会移位 0 而不是 1。 - Himadri Choudhury
好的。很好。我可以为这个类创建模板吗?像 Int<N> 这样的东西? - Himadri Choudhury
2
在Python中,你不能真正地模板化类,但是你可以编写类,使其在实例化时采用所需的字长并相应地运行。 - kindall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接