3

我继承自 int,因为我想为按位运算实现一个简单的接口。由于 int 的不可变性,我必须使用整数成员函数,如int.__and__, ... 。

class Bitset(int)
    ...
    def __setitem__(self, index, value):
        if value:
            self.__ior__(1 << int(index))
        else:
            self.__iand__(~(1 << int(index)))

在我的一个成员函数中,我想使用|=and&=函数,但是整数没有__ior__and__iand__成员函数。所以我的问题是我该如何解决这个问题?

编辑:

我不想简化二进制操作,我想操作整数的位。例如

a = Bitset(0)
a[0]
>>>0
a[0] = 1
a[0]
>>>1

但是我不想重新实现每个整数运算,它应该仍然可以工作。如果我包装一个内部整数,我必须这样做。例如

a = Bitset(0)
a += 1

应该仍然有效。

4

2 回答 2

1

已经有用于按位运算的简单接口(参见http://docs.python.org/reference/expressions.html#summary),例如:

4 >> 1
# 2

你没有 __ior__ 和 __iand__ 但你有 __and__ 和 __or__。但我怀疑你想要的实际上是实现按位运算的 __ror__ 和 __rand__ 。整数确实有那些最后的魔法方法。关于魔术方法,请参阅:http ://www.rafekettler.com/magicmethods.html#numeric

另见:http ://wiki.python.org/moin/BitwiseOperators

于 2012-08-06T09:55:03.507 回答
1

ints 既不可下标也不可变,因此您无法编写工作__setindex__()方法。似乎描述基本上是一个可变的位向量类,例如这个似乎是由 Guido 编写的。您可以使用提供的__int__()__long__()方法将其转换为整数值(尽管我认为您不再需要后者)。

于 2012-08-06T23:13:25.293 回答