文章目录
- -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。