剑指offer:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
![]()
![]()
基本思路:先判断整数二进制表示中最右边是不是1,接着把输入的整数右移一位,在判断最右是不是1,直到整个整数变为0为止。
int NumberOf1(int n){int count=0;while(n){if(n&1)count++;n=n>>1;}return count;}

为了避免死循环,可以不进行右移i.首先把i和1做与运算,判断i的最低位是不是为1,接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1,。。。。。。。。。。
int NumberOf1_Solution1(int n){int count = 0;unsigned int flag = 1;while(flag){if(n & flag)count ++;flag = flag << 1;}return count;}
还有一种更优的解法:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
int NumberOf1_Solution2(int n){int count = 0;while (n){++ count;n = (n - 1) & n;}return count;}

浙公网安备 33010602011771号