2017-11-05 3 views
3

は私が本の中で、次のコードを見つけました:Pythonのビット単位の操作

def count_bits(x): 
    num_bits = 0 
    while x: 
     num_bits += x&1 
     x >>= 1 
return num_bits 

print(count_bits(12)) 

私はこの行を理解していない(num_bits + = X & 1)

のは、私が入力12(1100ましょう)、最初の文字( "1")がカウントされます。しかし、右シフトがあり、1100は0110になります。カウンタが2番目の文字に移動すると、1は2回カウントされませんか?

+0

、それは「Pythonでプログラミングインタビューの要素」23ページ:-)のですか? –

+0

@AzizAltoはい!私は今、本を読んでいます。作者の名前の1つは、あなたのハンドルのようなAzizです。それは偶然だろうか、それとも...? – YingSquared

+0

まったく偶然!それはちょうど私が昨日、幸運の正確な例を通して本をブラウズしていたことが起こります! : - ] –

答えて

2

x&1チェック右端のビットは、あなたの例のためにそれを行うだろうので、1

の場合:

1100 & 0001 # 0 
0110 & 0001 # 0 
0011 & 0001 # 1 
0001 & 0001 # 1 

と正しく右シフトすることにより2を返し、あなたがするまで右から左にビットを数えます0000の最後のシフト結果とループ

2

1は0b0001である。それと0b1100のANDをとると0になります。重複カウントは決してありません。

0

コード

num_bits += x&1 
を破ります

最下位ビットが設定されているかどうかをチェックし、num_bitsに1がセットされている場合はチェックします。

x >>= 1 

次に、数字を右に1ビットシフトし、最下位ビットをシフトアウトします。

最後

、ループ条件

while x: 

小切手番号に設定されたビットが残っている場合、最終的なセットビットがシフトアウトされると、このチェックが失敗します。参考のため

関連する問題