文章目录
- -x
- x & -x,当x为偶数时
- x & -x,当x为奇数时
- x&-x 的实际用途
-x
-x
在二进制里表示对 x
的二进制按位取反(~x)之后再加 1
,即
-x = ~x+1
x & -x,当x为偶数时
在执行 x & -x
时,若 x
为偶数,最后结果肯定有如下两个特征:
- 这个结果只有一位值是1, 其他位均是0
- 这个值的末位0的个数与原值保持一致
从数学上推导,因为 偶数
的二进制末尾一定由 k
个 0
构成,如:110(6) 100(4)。
那么对其按位取反一定得到 k
个 1
,当再对 ~x
进行 加一
操作后,一定能得到 1个1
和 k个0
,而在 1
前面的数已经全部 按位取反
,唯有 1 后面的数经过 取反->加一进位(形同再次取反)
,变回了原来的数,但我们知道,1
后面原本就是 k个0
,因此, 证得上述两个特征。
用几个实例来证明:
x = 4
x:100
~x: 011
-x=~x+1: 100
x & -x: 100x = 6
x: 110
~x: 001
-x: 010
x & -x: 010x = 10
x: 1010
~x: 0101
-x: 0110
x & -x: 0010
而这个结果有什么用呢?实际上这个结果是能整除这个偶数的最大的2的幂, 即:
m = n & -n
,则 n % m = 0
, 且 m = 2 ^ k
。
x & -x,当x为奇数时
x
为奇数时就比较简单了, 因为奇数取反后的值一定是偶数, 也就是有 k个0
。对其进行 加一 操作也就是变成了 k-1个0
和 1个1
,形如:00…001(k-1个0),不会发生进位,因此只有最后一位变成了原本的数,也就是 1
,因此 x&-x
值为 1
。
用几个实例来证明:
x = 3
x:11
~x: 00
-x=~x+1: 01
x & -x: 01x = 5
x: 101
~x: 010
-x: 011
x & -x: 001x = 11
x: 1011
~x: 0100
-x: 0101
x & -x: 0001
x&-x 的实际用途
实际上如果用过 Lowbit函数
,那么此时已经会恍然大悟了,没错, x & -x
正是 Lowbit函数
的一种实现方式。
这里简单说一下什么是 Lowbit函数
?Lowbit函数用来返回参数转为二进制后,最后一个1的位置所代表的数值。例如,Lowbit(34)的返回值将是2;而Lowbit(12)返回4;Lowbit(8)返回8;参数为任何奇数时返回1。