031 二进制中1的个数(keep it up, 看到这个题刚开始有点蒙)

2015-01-27 10:05:00 · 作者: · 浏览: 12

?

?
题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

?

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。

?

输出:

对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。

?

样例输入:
3
4
5
-1
#include 
          
           
#include 
           
             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 , getCount1(Number)); } //system(pause); return 0; } /************************************************************** Problem: 1513 User: Language: C Result: Accepted Time:80 ms Memory:912 kb ****************************************************************/
           
          

?

样例输出:
1
2
32
正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
-1011
原码:11011
反码:10100 //负数时,反码为原码取反
补码:10101 //负数时,补码为原码取反+1
移码:00101 //原数+10000
计算机中的正负数都用补码表示,知道这点这题就简单了,因为刚开始还在想怎么把负数的补码求出来。。。汗!
代码:

?
?
?
?