可能な重複:
How do you set, clear and toggle a single bit in C?
Removing lowest order bit設定解除右端セットビット
n
正の整数です。どのようにして右端のセットビットを解除することができますか?
セイn
= 7
=> n = 0111. 出力として0110
が必要です。目標を達成するための単純なビットごとのハックはありますか?
可能な重複:
How do you set, clear and toggle a single bit in C?
Removing lowest order bit設定解除右端セットビット
n
正の整数です。どのようにして右端のセットビットを解除することができますか?
セイn
= 7
=> n = 0111. 出力として0110
が必要です。目標を達成するための単純なビットごとのハックはありますか?
&
はあなたの質問は不明である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!)
unsigned int clr_rm_set_bit(unsigned int n)
{
unsigned int mask = 1;
while(n & mask) {
mask <<= 1;
}
return n & ~mask;
}
Prasoon'sがO(1)の間はO(N)です。また、 'while(!(n&mask))'のようなものが欲しいですが、 'n = 0'でもそれはうまくいきません。 –
実際、この方法(正しく実装されている場合)は 'O(n)'ではありません。それは 'O(log(n))'です。また、nは符号なし整数のサイズによって制限されるため、これをO(1)と呼ぶこともできます。 – Artelius
いいえ、n == 0とn
ですn & (n-1)
をお試しください。あなたはビットのうち最下位ビットの設定を解除したい場合は
x &= -2;
x &= ~1;
x -= (x&1);
:あなただけ解除ビット0にしたい場合は
は、ここに(関与あなたのタイプに応じて、行動のわずかな変化で)いくつかの方法でありますここでセットは、いくつかの方法があります。
x &= x-1;
x -= (x&-x);
x&-x
注意がx
符号なしまたは補数少なくともとき、x
の最下位ビットに等しいこと。このようなビット演算をしたい場合は、符号付きの型はビット単位の演算で実装定義の振る舞いを持つため、符号なしの型だけを使用してください。
"右端のビットが"完全にはっきりしています。それはちょうどよく選ばれた例ではありませんでした。 –
@ taspeotis:質問をもう一度チェックしてください。「どのように最右端**ビットを設定しないのですか?」 –
ああ、そうです。私は "set"という言葉を見落とした。 –
+1ニース!私はまだ人々がそれほど迅速にそのようなソリューションを見ている方法を理解していません。 – Dawson