请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数。
解法一:要知道整数二进制表示中1的个数,可以先让该数与1做与操作,判断最后一位是否为1;之后再将1左移1位变为2,再和原数做与操作,判断原数倒数第二为是否为1,这样经过32此操作(整数4个字节,32位),便可以得到该数中1的个数。
1 #include<iostream> 2 3 int NumberOf1(int n){ 4 int count = 0; 5 unsigned int flag = 1; 6 while(flag){ 7 if(flag & n) 8 count++; 9 flag <<= 1; 10 } 11 return count; 12 } 13 14 int main(){ 15 int inputNumber; 16 while(std::cin>>inputNumber){ 17 std::cout<<NumberOf1(inputNumber)<<std::endl; 18 } 19 return 0; 20 }
解法二:上面的算法需要移位32次,下面的方法可以使原数中有几个1就做多少次操作,对于一个二进制数,减去1,则二进制数中最右面的一个非0位会变为0,后面所有的位
变为1,原数与其减1的数做一个与操作,那么其最右面的一个1就变为了0,其他位保持不变,那么直到原数变为0为止,能有多少次这样的操作,就表示有几个1;例如1100,其减1为1011,1100&1011=1000,这是一次操作,第二次1000减1为0111,1000&0111=0000,第二次操作,一共有两次操作,实现代码如下:
1 #include<iostream> 2 3 int NumberOf1(int n){ 4 int count = 0; 5 while(n){ 6 count++; 7 n = (n-1)&n; 8 } 9 return count; 10 } 11 12 int main(){ 13 int inputNumber; 14 while(std::cin>>inputNumber){ 15 std::cout<<NumberOf1(inputNumber)<<std::endl; 16 } 17 return 0; 18 }