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)))

|=メンバー関数の 1 つで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 に答える