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