n&(n-1)

为奇数(n的二进制表示的末位为1): 
n:       xxxxxxxx1 
n-1:     xxxxxxxx0 
n&(n-1): xxxxxxxx0 
相当于去掉最右边的一个1。 

n为偶数且不等于0(n的二进制表示的末位为0): 
n:       xxxxx1000 
n-1:     xxxxx0111 
n&(n1-): xxxxx0000 
也是相当于去掉最右边的一个1。 

所以,程序的效果就是统计传入的参数的二进制表示中1的个数。 

如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个1.

<pre name="code" class="java"> public int NumberOf1(int n) {   //最优
	    int sum=0;
	    while(n!=0){
	     sum+=1;
		 n=(n-1)&n;
	     }
		 return sum;
	    }


 


转载地址:http://liujinpan75.iteye.com/blog/682292

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值