取消设置最右边的设置位

可能重复:
如何在C中设置,清除和切换一个位?
删除最低位

n是正整数。 如何解除最右边的设置位?

假设n = 7 => n = 0111.我想要0110作为输出。 是否有任何简单的按位攻击来实现目标?

尝试n & (n-1)其中&是按位AND

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

编辑 (回应Forest提供的评论)

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

你的问题不清楚。

如果您只是想取消设置位0,这里有一些方法(根据您所涉及的类型,行为略有不同):

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

如果要取消设置的位中的最低位,可以采用以下方法:

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

注意x&-x等于x&-x的最低位,至少当x是无符号或二进制补码时。 如果你想像这样做任何位算术,你应该只使用无符号类型,因为有符号类型在按位运算下具有实现定义的行为。

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