請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 '1'。
示例 2:
輸入:9
輸出:2
解釋:輸入的不是二進位制串,但其二進位制表示為 1001 中,共有三位為 '1'。
與二進位制相關的題目容易聯想到位運算,如果只是單純的從進製轉換入手,很有可能就走了一條遠路。通過位運算中的移位(>>
<<
)以及與或運算(&
|
)能夠很方便地實現一些功能。
按照常規思路來想可以用三步來解決這個問題:
(1)輸入乙個整數
,需要判斷這個整數是否直接就是二進位制的形式。是
->(2);否
->(3)
(2)統計數字中1的個數
(3)將這個整數轉化為二進位制數,統計數字中1的個數
由於第(2)步與第(3)步中統計數字1的個數
針對都是二進位制串而言,因此第(2)步可以封裝為乙個函式
//(1)判斷輸入數字n是否是二進位制串
bool
isbinary
(uint32_t n)
}return flag;
}
//(2)統計數字n中1的個數
intnumsone
(uint32_t n)
return nums_of_one;
}
前面兩步的函式有了,關鍵就是這個第(3)步,如果輸入的是乙個十進位制整數,怎麼把它轉成乙個二進位制數,目前思路就卡在了這裡,先記錄一下,回頭過來改一下。
主函式如下:
int
hammingweight
(uint32_t n)
return output;
}
劍指書上不僅考慮了正整數,還考慮了負數的情況,使用了移位運算來逐位判斷該整數的二進位制形式中存在多少位1。這就是高明之處,使用移位運算來避免了把十進位制數轉化為二進位制數。
這裡存在兩種思路如下:
負數的原因,不能將整數右移,相對的我們使用二進位制1來左移,通過1的不斷左移,與整數n的各位相與,這樣就能避免負數不能右移的尷尬。
class
solution
return count;}}
;
在上面的運算中,想要完整的統計乙個uint32_t
型別的整數,flag
需要左移32次。 《劍指Offer》位運算 二進位制中1的個數
時間限制 1秒 空間限制 32768k 熱度指數 304381 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。知識點 1 計算機中的符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位,三種表示方法各不相同...
二進位制位運算
與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...
二進位制位運算
一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...