【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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值