剑指Offer - 九度1513 - 二进制中1的个数

剑指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 }

 

你可能感兴趣的:(二进制)