1、x & (-x)
的结果是x
最右边的1
所在的位置的值
表达式 x & (-x)
是一个常见的位运算操作,用于提取整数x
在二进制表示中最右边的1
所在的位置。这个操作在二进制位上非常有效,尤其在处理位运算算法中广泛使用,例如寻找最低位的1
、判断数的奇偶性、检查二进制表示中的特定位。
解析 x & (-x)
x
是一个整数,比如6
,其二进制表示为110
。
-x
是x
的相反数。在二进制表示中,计算负数通常使用补码表示。补码的求法是对该数的所有位取反(0
变1
,1
变0
),然后加1
。
具体来说,-x
的二进制表示是x
所有位的取反再加1
。这样一来,x
和-x
在二进制表示上会有许多位互补,而唯一相同的部分就是x
最右边的1
。
示例
以x = 6
为例:
𝑥=6
的二进制是110
。
−x=−6
的二进制是010
。
进行位与操作 x & (-x) = 110 & 010
,结果为 010
,即 2
。
结果解释:
x & (-x)
的结果是x
最右边的1
所在的位置的值。这在二进制操作中可以用于:
判断x
是否是2
的幂(如果 x & (-x) == x
,则 x
是2
的幂)。
快速获取最低位的1
,适用于很多位运算的算法中。
2、x&(x-1)
是将x
的二进制表示中的最右边(最低位)的1
清除
x = 6
举例:
二进制为110
, 6 & (6-1)= 110 & 101 = 100
这一步清除了最右边的1
,将x
变成4
(二进制100
)
3、常见的位运算
x&(-x)
:保留二进制表达式最低位的1
,其余位置0
x & (x-1)
: 消除x
的二进制表达式中最低位的1
,其余保持不变(x>>i) & 1
或者x & (1<<i)
:获取x
的二进制表达式中的第i
位数字,最常用的是取二进制下的最末位,即x&1
,用于判断奇偶x = x|(1<<i)
:设置第i
位为1
x = x & (~(1<<i))
:设置第i
位为0
x = x ^ (1<<i)
:将第i
位取反
4、位运算的优先级
按位反~
> 位移运算<<, >>
> 按位与&
> 按位异或^
> 按位或|