剑指Offer - 九度1513 - 二进制中1的个数
2013-11-29 23:35
题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
n保证是int范围内的一个整数。

输出:

对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。

样例输入:
3
4
5
-1
样例输出:
1
2
32
题意分析:
  这题是《编程之美》的原题了,只需要了解两个很巧妙的位操作:x & (-x),x & (x - 1)。
  x & (-x)是树状数组的lowbit操作,能取出x最低位的‘1’。
  x & (x - 1)则正好去掉x最低位的‘1’。
  要数出x中有多少个‘1’,只需要一个一个去掉直到x=0为止。时间复杂度O(log(x)),空间复杂度O(1)。
 1 // 651827    zhuli19901106    1513    Accepted    点击此处查看所有case的执行结果    1020KB    350B    80MS
 2 // 201311151734
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int x;
 9     int res;
10     int n;
11     int i;
12     
13     while(scanf("%d", &n) == 1){
14         for(i = 0; i < n; ++i){
15             scanf("%d", &x);
16             res = 0;
17             while(x){
18                 x = (x & (x - 1));
19                 ++res;
20             }
21             printf("%d\n", res);
22         }
23     }
24     
25     return 0;
26 }

 

 posted on 2013-11-29 23:44  zhuli19901106  阅读(278)  评论(0编辑  收藏  举报