取消设置最右边的设置位

Edw*_*ton 8 c c++ algorithm math bit-manipulation

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

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

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

Pra*_*rav 18

试试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!)
Run Code Online (Sandbox Code Playgroud)

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

n = 6 
n - 1 = 5

n & (n-1)=> 0 1 1 0   (6)
          & 0 1 0 1   (5)
           --------- 
            0 1 0 0  (done!)
Run Code Online (Sandbox Code Playgroud)

  • +1很好!我仍然不明白人们如此迅速地看到这样的解决方案. (4认同)
  • @Toolbox:要么我们之前见过它们,要么我们在童年时期发明它们.对我而言,这两者都有. (4认同)

R..*_*R.. 5

你的问题不清楚。

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

x &= -2;
x &= ~1;
x -= (x&1);
Run Code Online (Sandbox Code Playgroud)

如果您想取消设置已设置位中的最低位,可以使用以下一些方法:

x &= x-1;
x -= (x&-x);
Run Code Online (Sandbox Code Playgroud)

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

  • “最右边的设置位”似乎非常清楚。这只是一个选择不当的例子。 (5认同)