《程式設計之美》 求二進位制數中1的個數

2021-07-07 07:02:26 字數 1157 閱讀 9805

問題:

求乙個位元組(8bit)的無符號整型變數二進位制表示中「1」的個數。要求執行效率盡可能高。

分析與解法:

【解法一】

每次除2取餘,若為奇數則累加,最終累加結果為「1」的個數。

如,10100010除以2,商為1010001,餘數為0;1010001除以2,商為101000,餘數為1。時間複雜度o(log2v)

**:

int

count(int v)

return num;

}

【解法二】

將數字與00000001進行「與」操作,若結果為1,說明數字最後一位是1,累加,然後對數字進行右移。

位操作比算數運算的效率高,但時間複雜度仍為o(log2v)

**:

int count(int v)

return num;

}

但是如果v為負數,因為每次右移高位補的數字是其符號位,那麼最終v會變成0xffffffff而陷入死迴圈。

改進的**為:

int count(int v)

retrun num;

}

【解法三】

v & (v -1)操作每次能消去數字二進位制表示中最後一位1,該操作的次數即為數字中「1」的個數。

時間複雜度為o(m),m為v中1的個數。

**:

int count(int v)

}

【解法四】

因為數字只有8位,可以使用空間換時間。查表法,類似map的思想,即將每個數字中1的個數記錄在陣列中,v作為陣列的下標,每次只要直接查詢arr[v]的值,時間複雜度為o(1)

擴充套件問題:

如果變數是32位dword,使用或改進上述哪個演算法?

求整數a與b二進位制表示的漢明距離。

分析與解法:

【問題1】

由於數字長度較大,不能使用解法四,可以使用解法三或改進解法二。

【問題2】

可以先將a與b異或,得到的數值再求其中「1」的個數。

求二進位制數中1的個數 《程式設計之美》

求二進位制中1的個數。對於乙個位元組 8bit 的變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能的高。先來看看樣章上給出的幾個演算法 解法一 每次除二,看是否為奇數,是的話就累計加一,最後這個結果就是二進位制表示中1的個數。解法二 同樣用到乙個迴圈,只是裡面的操作用位移操作簡化了。...

程式設計之美 求二進位制數中1的個數

題目 對於乙個位元組的無符號整型變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能高。題目很簡單,一般人都可以用最直接的方法求解出來,通過求餘和模除運算。對二進位制操作過程中,除以乙個2,原來的數就會少乙個0,如果除過程中余1,則表示當前位置有乙個1,計數值加1,很簡單。但從執行效率來...

程式設計之美 求二進位制數中1的個數

文中講了五種方法 1.迴圈利用除法和模運算。該方法最容易想到。可謂沒有技術含量的。2.迴圈利用位移和按位與。用位操作代替算術運算,提高效率。3.只考慮數字中的1。有經驗規律知 對於2的方冪n與n 1取與為0.因而,可以利用該規律想法怎麼把原數字變為0,經過的步數就是1的個數。如果沒有相應的經驗或常識...