整數的二進位制表示中1的個數

2021-06-28 04:03:05 字數 1504 閱讀 4117

給出通常能想到的方式,這兩種方式在《c和指標》一書中給出。以下討論的均為非負整數。

/*

該方法每次在迴圈中判斷數的二進位制最右一位是否為1(如果該數能不能被2整除)。

每次迴圈後該數右移一位。因此遍歷了數的二進位制表示的每一位。

*/int count_one_bits1(int value)

/*與上邊方法類似,也是每次將該數右移一位,遍歷該數的二進位制表示的每一位。

不過這裡是將該數與1做與運算,這樣,與的結果不為零則說明該數的二進位制表示的最右一位為1。

*/int count_one_bits2(int value)

return count;

}//這裡只是上述方法的另外一種寫法

int count_one_bits3(int value)

return count;

}

以上給出的方法當數為負數的時候會死迴圈。因為計算機中數是用二進位制補碼表示的,負數右移其最高位補1(算術右移),那麼如上的方法,會一直右移,不斷在最高位補1,最終數字變為0xffffffff而陷入死迴圈。參考文章位運算的常見操作和題目

為了避免死迴圈,不右移數字value,而是現將value和1做與運算,判斷最低位是否為1;接著把1做移一位得到2,再和value與運算,判斷value的次低位是否為1;依次下去……判斷value的每一位是否為1。32位整數要迴圈32次

int count_one_bits4(int value) 

return count;

}

下面介紹另外一種方式,可以通過比上述少的比較次數來統計出數的二進位制表示中1的個數。

首先作如下分析:

n & (n - 1)可以將n的二進位制表示中最右側的乙個1去掉,例如1100 減去1得到1011,那麼 1100 & 1011得到1000,即將1100最右側的乙個1去掉。如下函式每次迴圈就去掉其二進位制表示中乙個1,那麼函式迴圈的次數就是其二進位制表示中所含1的個數

int count_one_bits3(int value) 

cout << endl;

return count;

}

while迴圈結束的條件是value為0,也就是當value是2的n次冪時,下一次迴圈就結束了,因為2的n次冪的二進位制表示中僅含有乙個1。迴圈中value = value & (value - 1)使得每次迴圈後,value的二進位制表示中1的個數少乙個。該方法與前兩個方法比,迴圈的次數少。

如下圖,輸入value為8888,可以看出方法1執行while迴圈14次,方法3執行while迴圈6次。方法3每次迴圈後value的二進位制中1的個數少乙個。

整數二進位制表示中1的個數

出自 題目 輸入乙個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。分析 這是一道很基本的考查位運算的面試題。包括微軟在內的很多公司都曾採用過這道題。乙個很基本的想法是,我們先判斷整數的最右邊一位是不是1。接著把整數右移一位,原來處於右邊第...

整數的二進位制表示中1的個數

題目 輸入乙個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。分析 這是一道很基本的考查位運算的面試題。包括微軟在內的很多公司都曾採用過這道題。乙個很基本的想法是,我們先判斷整數的最右邊一位是不是1。接著把整數右移一位,原來處於右邊第二位的...

整數的二進位制表示中 1 的個數

2019獨角獸企業重金招聘python工程師標準 輸入乙個整數,求該整數的二進位制表達中有多少個 1。例如輸入 10,由於其二進位制表示為 1010,有兩個 1,因此輸出 2。解法一是普通處理方式,通過除二餘二統計1的個數 解法二與解法一類似,通過向右位移依次處理,每次與1按位與統計1的個數 解法三...