题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法一:把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变为0。如,1100,其第二位是从最右边数起的第一个1,见1以后变为1011,即第二位左边的1保持不变,右边的从0变为1,与原先的数1100做与运算,结果为1000,结果中,刚好少一个1。代码如下:
1 class Solution { 2 public: 3 int NumberOf1(int n) 4 { 5 int count=0; 6 while(n) 7 { 8 ++count; 9 n=(n-1)&n; 10 } 11 return count; 12 } 13 };
方法二:首先判断n和1做与运算,判断n的最低位是不是为1,接着把1左移一位得到2,再和n做与运算,判断n的次低位是不是1,依次左移。代码如下:
1 class Solution { 2 public: 3 int NumberOf1(int n) 4 { 5 int count=0; 6 unsigned int flag=1; 7 while(flag) 8 { 9 if(n&flag) 10 ++count; 11 flag=flag<<1; 12 } 13 return count; 14 } 15 };
这种做法,每次跳出循环时,循环了整数的二进制的位数,如,32为的整数则需要循环32次,相对而言第一种方法好。
另外不能采用移动输入的数n的方法,会造成死循环。