二進位制中1的個數

2021-07-24 14:58:48 字數 1277 閱讀 4439

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。 —— [ 牛客網 ]

本題要求求解整數二進位制資料中1的個數,看到題目的時候,第一想法應該是遍歷一遍二進位制數,計算總數。即每一次與1之後右移,判斷是1則加1。

class

solution

return

count;

}};

針對正整數而言,這樣的演算法可以解決問題,但是針對負整數而言,題目說採用的補碼形式儲存,最高位是1代表負數,例如16位的整形負數-8,補碼形式為:1111111111111000。

1111111111111000-->1111111111111100 右移一位

1111111111111100-->1111111111111110 右移一位

1111111111111110-->1111111111111111 右移一位

...

對於負數的右移操作,為保證右移後依然是負數,所以填充的是1,如果按照上面的演算法思路,當填充到全1的時候,演算法會陷入死迴圈。

為了避免死迴圈,我們採用相對位移的方式,既然不能右移整數,那我們左移與運算的1的位置,計算1的個數。

解法一

class

solution

return

count;

}};

假設我們計算機的整形資料表示是32位的,那麼計算一次我們需要計算32次,如果能夠直接確定1的位置這樣來計算,可以更加快速的得到結果。

例如我們有整數110101,我們將整數減1可得到整數中最末尾的乙個1的位置之後的所有為0的數字轉換為1,而1之前的數字不變,進一步n&(n-1),即計算了一次1的位置。

110101 - 1 = 110100   110101 & 110100 = 110100   第乙個1出現

110100 - 1 = 110011 110100 & 110011 = 110000 第二個1出現

110000 - 1 = 101111 110000 & 101111 = 100000 第三個1出現

100000 - 1 = 011111 100000 & 011111 = 000000 第四個1出現,找到全部的1

解法二
class

solution

return

count;

}};

巧妙的轉換思維,利用二進位制位運算的技巧。

二進位制 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...

二進位制中1的個數 二進位制中0的個數

1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...

二進位制中1的個數

這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。其原理是不斷清除n的二進位制表示中最右邊的1或者最左邊的1,同時累加計數器,直至n為0 如7 0111 通過與 7 1 0110 與操作消去最最左邊的1,並累加計數...