输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
输入:
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
输出:
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
样例输入:
3
4
5
-1
样例输出:
1
2
32
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1513
统计1的个数其实是BIT结构的核心问题。http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees
Isolating the last digit
NOTE: Instead of "the last non-zero digit," it will write only "the last digit."
There are times when we need to get just the last digit from a binary number, so we need an efficient way to do that. Let num be the integer whose last digit we want to isolate. In binary notation num can be represented as a1b, where a represents binary digits before the last digit and b represents zeroes after the last digit.
Integer -num is equal to (a1b)¯ + 1 = a¯0b¯ + 1. b consists of all zeroes, so b¯ consists of all ones. Finally we have
Now, we can easily isolate the last digit, using bitwise operator AND (in C++, Java it is &) with num and -num:
a1b
& a¯1b
--------------------
= (0...0)1(0...0)
n&(-n)计算出数的最后一个1.
n-(n&(-n)),去掉最后一个1,重复上一步,过当当中记录重复次数。
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int count_ones(int n){
int sum=0;
while(n!=0){
n=n-(n&(-n));
sum++;
}
return sum;
}
int main()
{
int t,n;
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
printf("%d\n",count_ones(n));
}
return 0;
}