2017-12-12 17 views
0

私は声明を見つけたここ私は、いくつかのコードを理解しようとしていた。ビット演算n&(n-1)は何をするのですか?

n=n&(n-1); 

これは何をしますか?

+5

'x&(x - 1)'の結果が0の場合、 'x'は* 2の累乗*です。 [このページ](http://www.exploringbinary.com/ten-way-to-check-if-an-integer-is-a-power-of-two-in-c/)の#9を参照してください。 – meowgoesthedog

+0

誰かが私がそのようなビスタックスを学ぶことができるところを知っているなら、Please share.Thanks。 –

+0

https://graphics.stanford.edu/~seander/bithacks.html – pm100

答えて

8

この式は、nの最下位の非ゼロビットをゼロにします。

ここでは8ビットと仮定すると、封筒の説明の後ろになります。 nが結果として70

n  = 01000110 
n-1  = 01000101 
      -------- 
n&(n-1) = 01000100 

とする、結果が0である場合、それは2のべき乗であった(またはそれがであることに0であった意味し、本来nに設定された1ビットのみが存在した手段)。

nが0になるまで繰り返しループすると、反復回数はnに設定されたビット数を元々カウントします。ただし、ほとんどのプロセッサには、これを行うための組み込み操作が用意されています。


ビットハッキングが一般的に関心がある場合、このサイトで「ビンタックス」を検索すると多くのヒットが生成されます。

+1

これは、 'n'が' unsigned'型であると仮定します。また、0は2の累乗であることを示します。 – Peter

+0

@Peter:2の補数と符号の大きさで動作するようです。 0を指摘してくれてありがとう。 – jxh