/* 28.整数的二进制表示中 1 的个数 题目:输入一个整数,求该整数的二进制表达中有多少个 1。 例如输入 10,由于其二进制表示为 1010,有两个 1,因此输出 2。 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; /* 其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0, n-1与n相同除了最低位 n相当于在n-1的最低位加上1。 8(1000)= 7(0111)+ 1(0001), 所以8 & 7 = (1000)&(0111)= 0(0000), 清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。 再比如7(0111)= 6(0110)+ 1(0001),==>3 1:7 & 6 = (0111)&(0110)= 6(0110), 2:0110&0101=0100 3:0100&0011=0; 如果n的二进制表示中有k个1,那么这个方法只需要循环k次 */ int count1(int n) { int c=0; while (n!=0) { n=n&(n-1); c++; } return c; } int count2(int n) { int c=0; while(n) { if(n&1) //if(n%2==1) c++; n =n>>1; } return c; } int main() { int n; while(cin>>n) { printf("%d:其二进制中总共有%d个1,对是%d个1\n",n,count1(n),count2(n)); } return 0; }