求二进制数中1的个数

编程之美中有这道题,不过我比较喜欢上面的有一种方法,很简洁,如下:

 1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int v = 9,count=0;
6 while(v)
7 {
8 v&=(v-1);
9 count++;
10 }
11 cout<<count<<endl;
12 return 0;
13 }

上次看到另一种方法,编程之美好像没有讲,感觉也很牛逼,如下:

 1 /*
2 分析如下:
3 举个例子,给定一个数,为 10 01 11 01 (一个字节,8bit)
4 1. 相邻的两个1bit 相加,得到 01 01 10 01
5 2. 相邻的两个2bit 相加,得到 00 10 00 11
6 3. 相邻的两个4bit 相加,得到 00 00 01 01
7 //.......当给定的数为2字节时,再相应的加上以下语句.........
8 4. 相邻的两个8bit 相加,得到 00 00 01 01
9 //.......当给定的数为4字节时,再相应的加上以下语句.........
10 5. 相邻的两个16bit相加,得到 00 00 01 01
11 */
12 #include <iostream>
13 using namespace std;
14 int main()
15 {
16 int u;
17 while(cin>>u){
18 u = ((u&0x55555555) + ((u>>1)&0x55555555)); // 1
19 u = ((u&0x33333333) + ((u>>2)&0x33333333)); // 2
20 u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f)); // 3
21 u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff)); // 4
22 u = ( u&0x0000ffff) + (u>>16); // 5
23 printf("%x\n",u);
24 }
25
26 return 0;
27 }



 

continue my dream...
原文地址:https://www.cnblogs.com/chenbin7/p/2195316.html