取消设置最右边的设置位
可能重复:
如何在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; }