写一个函数,返回数字中二进制位为'1'的个数。比如36,化为二进制得到100100,其中有2个'1'。方法1:分别判断各个位
int
bit_count(unsigned
int
n)
{ int count; for(count = 0; n; n >>= 1) { count += n & 1; } return count;}
方法2:循环中直接计算1的数量如何只数'1'的个数?如果一个数字至少包含一个'1'位,那么这个数字减1将从最低位开始依次向高位借位,直到遇到第一个不为'0'的位。依次借位使得经过的位由原来的'0'变为'1',而第一个遇到的那个'1'位则被借位变为'0'。36 d = 100100 b36-1 d = 100011 b如果最低位本来就是'1',那么没有发生借位。现在把这2个数字做按位与:n & n-1的结果是什么?2个数字在原先最低为'1'的位以下(包括这个位)的部分都不同,所以结果是保留了其他的'1'位。36 & 36-1 d = 100000 b这个结果刚好去掉了最低的一个'1'位
int
bit_count(unsigned
int
n)
{ int count; for(count = 0; n; n &= n - 1) { count++; } return count;}