191. 位 1 的个数 ●
191. 位 1 的個數 ●
描述
編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數為 ‘1’ 的個數(也被稱為漢明重量)。
示例
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位為 ‘1’。
題解
1. 循環檢查二進制位
直接循環檢查給定整數 n 的二進制位的每一位是否為 1。
具體的,從二進制數低位到高位進行檢查,每次移動 i ? 1 i- 1 i?1 位,并與 1 1 1 做 & 與運算,來檢查第 i i i 低位的數,
- 時間復雜度: O ( k ) O(k) O(k),其中 k 是 int 型的二進制位數, k = 32 k=32 k=32。我們需要檢查 n 的二進制位的每一位,一共需要檢查 32 位。
- 空間復雜度: O ( 1 ) O(1) O(1),我們只需要常數的空間保存若干變量。
2. 位運算優化
觀察這個運算: n & ( n ? 1 ) n~\&~(n - 1) n?&?(n?1),其運算結果恰為把 n 的二進制位中的最低位的 1 變為 0 之后的結果。
如: 6 & ( 6 ? 1 ) = 4 , 6 = ( 110 ) 2 , 4 = ( 100 ) 2 6~\&~(6-1) = 4, 6 = (110)_2, 4 = (100)_2 6?&?(6?1)=4,6=(110)2?,4=(100)2?,運算結果 4 即為把 6 的二進制位中的最低位的 1 變為 0 之后的結果。
這樣我們可以利用這個位運算的性質加速我們的檢查過程,在實際代碼中,我們不斷讓當前的 n 與 n?1 做與運算,直到 n 變為 0 即可。因為每次運算會使得 n 的最低位的 1 被翻轉,因此運算次數就等于 n 的二進制位中 1 的個數。
- 時間復雜度: O ( log ? n ) O(\log n) O(logn)。循環次數等于 n 的二進制位中 1 的個數,最壞情況下 n 的二進制位全部為 1。
- 空間復雜度: O ( 1 ) O(1) O(1),我們只需要常數的空間保存若干變量。
總結
以上是生活随笔為你收集整理的191. 位 1 的个数 ●的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CDO基础操作(一):用CDO进行数据查
- 下一篇: ADAS/ADS 整车下线标定解决方案