2011-01-16 8 views

答えて

18

&はあなたの質問は不明であるbitwise AND

n = 7 
n - 1 =6 

n & (n-1)=> 0 1 1 1 (7) 
      & 0 1 1 0 (6) 
      --------- 
      0 1 1 0 (done!) 

EDIT(森によって与えられたコメントに応答して)

n = 6 
n - 1 = 5 

n & (n-1)=> 0 1 1 0 (6) 
      & 0 1 0 1 (5) 
      --------- 
      0 1 0 0 (done!) 
+1

@ taspeotis:質問をもう一度チェックしてください。「どのように最右端**ビットを設定しないのですか?」 –

+0

ああ、そうです。私は "set"という言葉を見落とした。 –

+4

+1ニース!私はまだ人々がそれほど迅速にそのようなソリューションを見ている方法を理解していません。 – Dawson

0
unsigned int clr_rm_set_bit(unsigned int n) 
{ 
    unsigned int mask = 1; 
    while(n & mask) { 
     mask <<= 1; 
    } 
    return n & ~mask; 
} 
+1

Prasoon'sがO(1)の間はO(N)です。また、 'while(!(n&mask))'のようなものが欲しいですが、 'n = 0'でもそれはうまくいきません。 –

+1

実際、この方法(正しく実装されている場合)は 'O(n)'ではありません。それは 'O(log(n))'です。また、nは符号なし整数のサイズによって制限されるため、これをO(1)と呼ぶこともできます。 – Artelius

+0

いいえ、n == 0とn

4

ですn & (n-1)をお試しください。あなたはビットのうち最下位ビットの設定を解除したい場合は

x &= -2; 
x &= ~1; 
x -= (x&1); 

:あなただけ解除ビット0にしたい場合は

は、ここに(関与あなたのタイプに応じて、行動のわずかな変化で)いくつかの方法でありますここでセットは、いくつかの方法があります。

x &= x-1; 
x -= (x&-x); 
x&-x

注意がx符号なしまたは補数少なくともとき、xの最下位ビットに等しいこと。このようなビット演算をしたい場合は、符号付きの型はビット単位の演算で実装定義の振る舞いを持つため、符号なしの型だけを使用してください。

+5

"右端のビットが"完全にはっきりしています。それはちょうどよく選ばれた例ではありませんでした。 –

関連する問題