WHCSRL 技术网

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.
这个性质一般用于获取某个二进制数的最小比特位