- 题目描述:
-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- 输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
- 输出:
-
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
- 样例输入:
-
3 4 5 -1
- 样例输出:
-
1 2 32
分析:(常规算法)把1和n做与运算,检验n最右一位是不是1,然后把1左移一位检验n右边第二位是不是1,依次进行,就可以得出n的2进制中有多少个1.
(惊喜算法)把n-1与n做与运算,会把n最右边一个1变成0,那么n的二进制表示中有多少个1,就可以进行多少次这样的操作.#include <stdio.h> unsigned int flag=1; void NumOfOneNormal(int n) { flag=1; int cnt=0; while(flag) { if(n&flag) cnt++; flag=flag<<1; } printf("%d ",cnt); } void NumOfOne(int n) { int cnt=0; while(n) { cnt++; n=(n-1)&n; } printf("%d ",cnt); } int main() { int n,t; while(~scanf("%d",&t)) while(t--) { scanf("%d",&n); NumOfOne(n); } return 0; }