取消设置最右边的位

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

n是一个正整数。 它的最右边的位怎么可能不被设置?

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


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

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!)

你的问题不清楚。

如果你只是想设置位0,下面是一些方法(根据你所涉及的类型,行为有轻微的变化):

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

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

x &= x-1;
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;
}
链接地址: http://www.djcxy.com/p/28789.html

上一篇: Unset the rightmost set bit

下一篇: Change a bit of an integer