031 二進制中1的個數(keep it up, 看到這個題剛開始有點蒙)

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章