請用lowbit解決如下問題:
輸入乙個32位整數,輸出該數二進位制表示中1的個數。
注意:
輸入:9
輸出:2
解釋:9的二進位制表示是1001,一共有2個1。
輸入:-2
輸出:31
解釋:-2在計算機裡會被表示成11111111111111111111111111111110,
一共有31個1。
-2
31
中,lowbit的用法
lowbit(n)函式取出n在二進位制表示下最低位的1以及它後面的0構成的數值
lowbit
(x)=n&
(~n+
1)
原理:
假設x最低位的1在第k位上
則 ~ n的二進位制的第k位為0, 0~k-1位全部為1,k+1 ~ inf位也被取反
於是~ n + 1 由於進製,0~k-1位全部為0,第k位為1,k+1 ~ inf位仍然和原來相反
於是n&(~ n + 1)自然就只剩下最低位的1以及它後面的0構成的數值了
由於補碼下:~ n=-1-n
於是
lowbit
(x)=x&
(-x)
#include
using
namespace std;
intlowbit
(int n)
intnumberof1
(int n)
return res;
}int
main()
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
演算法 二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。看到這個題目,就應該想到,這樣的題目需要用位運算來解決,這才是正確的門,要是沒想到用位運算,那就是還沒入門。思路一 既然是位運算,那可不可以直接用1與輸入n進行 位運算,結果為1的話,個數加一,否則個數不變,之後n向右位移1。這樣做是...
演算法 二進位制中1的個數
請實現乙個函式,輸入乙個整數 以二進位制串形式 輸出該數二進位制表示中 1 的個數。例如,把 9表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...