可能重复:
How do you set, clear and toggle a single bit in C?
Removing lowest order bit
n
是一个正整数。如何解除最右边的设置位?
说n
= 7
=> n = 0111。
我希望0110
作为输出。是否有任何简单的按位攻击来实现目标?
答案 0 :(得分:18)
尝试n & (n-1)
&
为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!)
n = 6
n - 1 = 5
n & (n-1)=> 0 1 1 0 (6)
& 0 1 0 1 (5)
---------
0 1 0 0 (done!)
编辑(响应Forest提供的评论)
{{1}}
答案 1 :(得分:4)
你的问题不清楚。
如果您只是想取消设置位0,这里有一些方法(根据您所涉及的类型,行为略有不同):
x &= -2;
x &= ~1;
x -= (x&1);
如果要取消设置的位中的最低位,可以采用以下方法:
x &= x-1;
x -= (x&-x);
请注意,x&-x
等于x
的最低位,至少当x
是无符号或二进制补码时。如果你想像这样做任何位算术,你应该只使用无符号类型,因为有符号类型在按位运算下有实现定义的行为。
答案 2 :(得分:0)
unsigned int clr_rm_set_bit(unsigned int n)
{
unsigned int mask = 1;
while(n & mask) {
mask <<= 1;
}
return n & ~mask;
}