C++随笔
1、 x&-x表示含义
-x
的值是在x的值的基础上进行按位取反~x
之后,加一所得,等价于
x & -x == x & (~x + 1)
当x为偶数时,0000 0100 1110
,按位取反结果为1111 1011 0001
, 加一后为 1111 1011 0010
。得到的结果与原x相与之后结果,只会有一位保留为1,这个结果与原x的末尾0的个数是一致的
0000 0100 1110&1111 1011 0010 = 0000 0000 0010
所以当x为偶数时结论:
1.这个结果只有一位值是1,其他位均为0
2.这个值的末位0的个数与原值保持一致
- 1
- 2
进一步得出结论:
当一个偶数与它的负值相与时,结果是能整除这个整数的最大的2的幂,即:m=n&-n,则n%%m=0,且m=2^k
当x为奇数时,奇数取反后值为偶数,偶数的值+1之后,并不会影响进位,而x与取反的数相与结果肯定是0,但是由于相与的数是取反后再+1(奇数),所以说只有最后一位有翻转,所以只有最后一位都是1,相与结果仍然是1,而其他位所有的都是相反,相与一定为0,所以如果x是奇数,那x&-x
的结果一定是1。
最终结论:
当一个数与其取负后的值相与,如果这个数是偶数,则结果是能整除这个偶数的最大的2的幂,如果是奇数,则结果必为1.
这个性质一般用于获取某个二进制数的最小比特位
推荐阅读