題目:請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 『1』。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000 中,共有一位為 『1』。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 『1』。
看完題目首先想到的也是最直接的方法,那就是把n往右移32次,每次都和1進行與運算,這樣迴圈32次就能得出1的個數了。直接上**。
class
solution
}return count;}}
;
解完後自己又想了一種辦法,因為二進位制數每一位都是2的冪次方,那我們就先找到不大於n的2的最大冪次,然後計數值+1;再用n-2^(i-1) 再次與2^i 比較,直到n-2^(i-1)>=2時退出迴圈。然後再判斷如果他們的差值,如果等於1,說明是奇數,則最後一位為1,返回最終計數值+1;如果他們差值為0,直接返回最後計數值。
class
solution
tem-
=pow(2
,i-1);
num++;}
if(tem==1)
return
(int
)num+1;
else
return
(int
)num;}}
;
可能上面說的不太好理解,下面介紹一種大佬寫的方法:
巧用n&(n−1)
(n - 1)解析: 二進位制數字 n最右邊的1變成 0,此1右邊的0都變成 1
,n&(n−1) 解析: 二進位制數字n最右邊的1變成 0,其餘不變。
演算法流程:
初始化數量統計變數 res 。
迴圈消去最右邊的 1:當 n = 0時跳出。
res += 1 : 統計變數加 1;
n &= n - 1 : 消去數字 n最右邊的 1。
返回統計數量 res
class
solution
return res;}}
;執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00
%的使用者
記憶體消耗:5.7 mb, 在所有 c++ 提交中擊敗了86.21
%的使用者
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
二進位制中1的個數 二進位制中0的個數
1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...
C 二進位制中1的個數
題目 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。方法一 include include using namespace std intnums int n flag flag 1 flag左移一位 return count int main 結果 思路 計算機中儲存正數是原碼...