問題:
求乙個位元組(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的個數。如果沒有相應的經驗或常識...