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)
你的问题不清楚。
如果您只想取消设置位 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为无符号或二进制补码时。如果您想要执行任何像这样的位算术,则应该仅使用无符号类型,因为有符号类型在按位运算下具有实现定义的行为。