劍指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
****************************************************************/