二進位制中1的個數(C 簡單區)

2021-10-09 13:42:22 字數 1606 閱讀 7899

題目:請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 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 結果 思路 計算機中儲存正數是原碼...