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

2021-06-14 10:12:14 字數 638 閱讀 4368

題目:對於乙個位元組的無符號整型變數,求其二進位制表示中「1」的個數,要求演算法的執行效率盡可能高。

題目很簡單,一般人都可以用最直接的方法求解出來,通過求餘和模除運算。對二進位制操作過程中,除以乙個2,原來的數就會少乙個0,如果除過程中余1,則表示當前位置有乙個1,計數值加1,**很簡單。但從執行效率來看,這個**其實也不會很複雜,但有更加簡單的方法,作為乙個程式設計師就不應該放棄。我們知道要提高程式的時間執行效率,典型的方法就是以空間換時間。對8位的二進位制數,總共的可能輸入也只有256個,如果要想得到最優的時間複雜度,只需要把這256個二進位制數對應的「1」的個數存入乙個陣列中,然後直接從這個陣列中取就行了。演算法的時間複雜度僅為o(1)。但是這個方法對於位數多的二進位制數顯然不可取。

將演算法的時間複雜度降到o(m),其中m是該二進位制數的「1」的個數,這樣的時間複雜度應該已經是最優的了。我們知道在判斷乙個二進位制數中只有乙個「1」的時候,通過判斷這個數是否是2的整數次冪得到。例如01000000,如果要得到0,可以和00111111進行與操作。事實上,進行的是01000000&(01000000-00000001)=01000000&00111111=0,所以可以得到下列**:

int count(byte v)

returnnum; }

這個解法對二進位制位數多少都是具有很大的時間優勢的。

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

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

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

問題 求乙個位元組 8bit 的無符號整型變數二進位制表示中 1 的個數。要求執行效率盡可能高。分析與解法 解法一 每次除2取餘,若為奇數則累加,最終累加結果為 1 的個數。如,10100010除以2,商為1010001,餘數為0 1010001除以2,商為101000,餘數為1。時間複雜度o lo...

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

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