【剑指offer】面试题10:二进制中1的个数

这个题前,我们回想下经常遇到的另一个问题,给定一个整数,判断该整数是否是2的幂次。而所谓一个整数是2的幂次,就是说这个整数的2进制写法中,只有1个 。比如 1,是2 的0次幂,2 (10)是2的1次幂,等等。

至于如何判断一个整数是否是2的幂次,我们先放一边,先来看看二进制中减 1的问题,对于一个整数,我们对其减去1,在二进制表示下,0肯定不够减1,所以就会向其左侧的高位寻求借位,然而高位的0肯定也借不得,只有继续向左,直到遇到一个能借位给它的1存在,这时,这个第一个遇到的1被其借走,自身变为0,且其右侧的0变为1。如 10,其二进制位 1010,减去1 变为 1001接下来,10 & 01 = 00。但是1010 & 1001 = 1000,并不等于0,说明该整数不止存在一个1,而是多个,所以我们能够得到判断 一个整数是否为2的幂次的方法:(n) &( n - 1) == 0。

而n & (n - 1) 得到的效果是,将整数n的二进制写法中,所有1 中最低位的 1 置为了 0。 

回到本题,要我们找出二进制中的所有 1 ,其实就是看把 1置为0的操作要进行多少次。


附书中代码:

int NumberOf1(int n){
	int nums = 0;
	while (0 != n)
	{
		n  &= (n - 1);
		++nums;
	}
	return nums;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值