n & (n-1)的妙用

n&(n-1)的妙用(强大的位运算)

本文参考(http://blog.csdn.net/zheng0518/article/details/8882394)


简单介绍下,按位与的知识

 按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。
 只要对应的二个二进位都为1时,结果位就为1
 n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子: 
 n = 10100(二进制)
 则(n-1) =10011 ==》n&(n-1) = 10000 可以看到原本最低位为1的那位变为0。

n&(n-1)具体应用


1、 求某一个数的二进制表示中1的个数

while (n >0 ) {
      count ++;
      n &= (n-1);
}
每次n和n-1按位与,n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000
二进制原本最低位为1的那位变为0。二进制1的个数减一,最终值为0时,没有1存在,
count值就为1的个数。

2、判断一个数是否是2的方幂

n > 0 && ((n & (n - 1)) == 0 )
解释((n & (n-1)) == 0):

如果A&B==0,表示A与B的二进制形式没有在同一个位置都为1的时候。

那么本题到底啥意思??

不妨先看下n-1是什么意思。

   令:n=1101011000(二进制,十进制也一样)
   则:n-1=1101010111
   n&(n-1)=1101010000

由此可以得出,n和n-1的低位不一样,直到有个转折点,就是借位的那个点,从这个点
开始的高位,n和n-1都一样,如果高位一样这就造成一个问题,就是n和n-1在相同的
位上可能会有同一个1,从而使((n & (n-1)) != 0),如果想要((n & (n-1)) ==0),
则高位必须全为0,这样就没有相同的1。所以n是2的幂或0

3、计算N!的质因数2的个数

假设是8! 有1 2 3 4 5 6 7 8
第一次 则它有 2 4 6 8四个具有2的质因数,8/2=4
第二次 2 4 6 8变为 1 2 3 4 则只有 2 4具有2的质因数,8/4=2
第三次 2 4 变为 1 2 则只有2 具有2的质因数,8/8=1

容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + ....
下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示)
现在我们跟踪最高位的1,不考虑其他位假定为0,
则在
[N / 2]    01000
[N / 4]    00100
[N / 8]    00010
[N / 16]  00001
则所有相加等于01111 = 10000 - 1
由此推及其他位可得:
(10101)!的质因数2的个数为10000 - 1 + 00100 - 1 +00001 - 1 = 10101- 3
(二进制表示中1的个数)
推及一般N!的质因数2的个数为N - (N二进制表示中1的个数)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值