取消设置最右边的设置位

时间:2011-01-16 05:24:53

标签: c++ c algorithm math bit-manipulation

  

可能重复:
  How do you set, clear and toggle a single bit in C?
  Removing lowest order bit

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

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

3 个答案:

答案 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;
}