-
题目描述:
-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
-
输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
-
输出:
-
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
-
样例输入:
-
3 4 5 -1
-
样例输出:
-
1 2 32
本题正负都有
代码如下:
#include <iostream> #include <string> #include <string.h> #include <map> #include <stdio.h> #include <algorithm> #include <queue> #include <vector> #include <math.h> #include <set> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define SWAP(a , b){ int temp = a; a = b; b = temp;} using namespace std; int main() { int n,k; cin >> n; while(n--) { scanf("%d",&k); int num = 0; /*while(k)//正负皆可 { k &= (k - 1); num++; }*/ /*while(k)//只适用于正数 { if(k%2 == 1) num++; k = k/2; }*/ while(k)//只适用于正数 { num += k&0x01; k >>= 1; } printf("%d\n",num); } return 0; }
扩展问题:给二进制表示的两个数A,B,将A变成B,至少需要改变多少位?