Unset the rightmost set bit

36 浏览
0 Comments

Unset the rightmost set bit

这个问题已经有了答案:

可能的重复问题:

如何在C语言中设置、清除和切换单个位?

移除最低位的位

n是一个正整数。如何取消它的最右设置位?

假设n= 7 => n = 0111。

我想要0110作为输出。是否有任何简单的位运算技巧来实现这个目标?

admin 更改状态以发布 2023年5月24日
0
0 Comments

您的问题不清楚。

如果您只想取消第0位,以下是一些方法(受涉及类型的微小差异影响而行为略有不同):

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

如果您想取消设置的最低位中的位之一,以下是一些方法:

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

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

0
0 Comments

尝试使用 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!)

编辑(针对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