2

PythonにXORビット削減オペランドまたは関数はありますか? 自分で書くのは問題ありませんが、組み込み済みのすべてのスクリプトに記述する必要はありません。

r=x&1
for i in xrange(1,63):
    r=r^((x>>i)&1)
4

5 に答える 5

3

これはあなたの質問には答えませんが、そのコードは次と同じです:

def parity(x):
    k = 0
    d = x
    while d != 0:
        k = k + 1
        d = d & (d - 1)
    return k % 2

これには、数値のビット長に依存しないという利点があります。ループはビット数ではなく数値の 1 の数 (つまり人口カウント) に依存するため、より高速です (たとえば、2**62あなたのものでは 46.6 マイクロ秒かかり、これは 3.02 マイクロ秒かかります)。

于 2011-09-18T19:14:58.673 に答える
2

基本的に、これは、x の 1 の数が偶数か奇数かを尋ねることと同じです。これは、x のパリティを尋ねることと同じです。

あなたが与えた解決策は確かに単純な解決策であり、他の方法と比較して恐ろしく非効率的です. これは、この問題やその他のビット関連の問題に対するいくつかの優れたソリューションを提供するサイトです: Bit twiddling hacks .
そこにある解決策はcで提供されていますが、それらをpythonに「翻訳」するのは難しくありません。

于 2011-09-18T19:15:37.107 に答える
1

楽しみのために、@Sven Marnachの回答の別のバージョンを次に示します。

r = sum(ord(ch) for ch in format(x, "b")) & 1

これは ASCII で機能するため、Unicode でも機能します。これが機能する理由は、「0」の序数値が 0x30 であり、最下位ビット位置に 0 ビットがあるためです。一方、「1」の序数値は 0x31 で、そこに 1 ビットがあります。とにかく最下位ビットを使用してビットごとに行おうとしている場合、これはint()「1」または「0」をビット値に強制するために使用するのと同じように機能します。

これは2倍以上の速さです!しかし、@Dan D.の答えはさらに高速です。のすべての数値のパリティを計算しますxrange(200000)。ベスト オブ 3 試行:

@Sven Marnach's answer:  1.550 seconds
this answer:             0.605 seconds
@Dan D.'s answer:        0.411 seconds

そして、より多くの試行(計算する数値が大きい)では、@Dan D.の答えがより大きな差で勝ちます。

于 2011-09-19T01:23:47.753 に答える
1

外部モジュールを使用してもかまわない場合は、bitstringcount()メソッドを使用できます。

簡潔な Python 式が必要な場合は、試してください。

r = sum(map(int, format(x, "b"))) & 1
于 2011-09-18T19:18:53.347 に答える
0

あなたが望んでいるものは正確には存在しないと思います。役に立つと思われるモジュール、bitstring モジュールを発見しました。

http://code.google.com/p/python-bitstring/

bitstream を使用してビットを 1 つずつ引き出してから、reduce() 関数内で operator.xor() を使用して問題を解決することをお勧めします。しかし、パリティを効率的に見つける while ループに勝るものはないと思います。

于 2011-09-18T19:43:50.253 に答える