这个题前,我们回想下经常遇到的另一个问题,给定一个整数,判断该整数是否是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;
}