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的个数与原值保持一致

进一步得出结论:
当一个偶数与它的负值相与时,结果是能整除这个整数的最大的2的幂,即:m=n&-n,则n%m=0,且m=2^k

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

最终结论:
当一个数与其取负后的值相与,如果这个数是偶数,则结果是能整除这个偶数的最大的2的幂,如果是奇数,则结果必为1.
这个性质一般用于获取某个二进制数的最小比特位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值