【C/C++】x & -x 的含义

1、含义

-x 的值,其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得(C语言中,-x实现是用取反+1实现)也就是说:x & -x == x & (~x + 1)

2、x 为偶数

当一个奇数 + 1时,表示的二进制数则会发生进位,这样的话,会产生一个连锁反应,也就是最低位的那些连续的1都会被清0,如:0000 0000 0111 1111 + 1 = 0000 0000 1000 0000

如果一个偶数,如 0000 0000 0100 1110,取反后的结果就变成了 1111 1111 1011 0001,而当这个值 + 1之后由于发生了进位,即:1111 1111 1011 0001 + 1 = 1111 1111 1011 0010

初始值 和 取反+1后的值 相 & 后,只会有一位保留为1

0000 0000 0100 1110 & 1111 1111 1011 0010 = 0000 0000 0000 0010 

这个结果与最初的值又有什么关系呢?
显然, 这个值的与原值的末位0的个数是一致的,也就是说,如果一个偶数,在执行 x & -x 的操作时,最后结果肯定有如下两个特征:

① 这个结果只有一位值是1, 其他位均是0 
② 这个值的末位0的个数与原值保持一致

那这是个什么数呢?
这个原值肯定是能被结果值整除的, 而这个结果值又是2^ k,那我们就可以描述成:当一个偶数与它的负值相 & 时,结果是能整除这个偶数的最大的2的幂。【即: m = n & -n ,则 n % m = 0 ,且 m = 2 ^ k】

3、x 为奇数

因为奇数取反后的值一定是偶数, 而偶数的值 + 1之后,并不会影响进位,而 x与其取反的数相 & 结果肯定是0 ,但是由于相 & 的数是取反后再+ 1的值(肯定是个奇数),也就是说,只有最后一位有翻转,所以只有最后一位都是1,相 & 结果仍旧是1,而其他位所有的都是相反值, 相 & 必为0。结论:如果 x 是奇数, 那 x & -x 的结果一定是1

4、❗结论

当一个数与其取负后的值相与(x & -x),如果这个数是偶数,则结果是能整除这个偶数的最大的2的幂(即: m = n & -n , 则 n % m = 0, 且 m = 2 ^ k);如果这个数是奇数,则结果必为1

5、❗用途

一般可以用来获取某个二进制数的 LowBit

你可能感兴趣的:(C语言,c语言,c++)