剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1513
-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。 -
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。 -
3 4 5 -1
-
1 2 32
-
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出:
正数的原码,补码,反码都相同,都等于它本身 负数的补码是:符号位为1,其余各位求反,末位加1 反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1就是补码 -1011 原码:11011 反码:10100 //负数时,反码为原码取反 补码:10101 //负数时,补码为原码取反+1 移码:00101 //原数+10000计算机中的正负数都用补码表示,知道这点这题就简单了,因为刚开始还在想怎么把负数的补码求出来。。。汗! 代码:
#include <stdio.h>
#include <stdlib.h>
int getCount1(int vNumber)
{
int i = 32;
int Count = 0;
while (i--)
{
if (vNumber & 0x00000001) ++Count;
vNumber >>= 1;
}
return Count;
}
int main()
{
int N;
int Number;
scanf("%d", &N);
while (N--)
{
scanf("%d", &Number);
printf("%d\n", getCount1(Number));
}
//system("pause");
return 0;
}
/**************************************************************
Problem: 1513
User:
Language: C
Result: Accepted
Time:80 ms
Memory:912 kb
****************************************************************/