1. 簡述
對乙個位元組(8bit)的無符號整型變數,求其二進位制表示中「1」的個數,要求演算法的執行效率盡可能的高。
2. 思路
我對這道題沒有什麼新的發現,也就是再說一遍程式設計之美上面的解答思路。第乙個思路就是乙個位乙個位的判斷,8位的數字,就是8次。第二個思路就是每次消減數字二進位制中的最後乙個1,直到數字變為0為止,這個方法僅與數字的二進位制中的1的個數有關,因此比第乙個思路的複雜度更好一點,每次消減最後乙個1的方法為num = num & (num-1)。
3. **
#include輸出結果為:using
namespace std;
unsigned char find_num_method_1(char num)
return count;
}unsigned char find_num_method_2(char num)
return count;
}int main()
4. 擴充套件問題
第乙個擴充套件:如果變數是32位的dword,你會使用哪一種方法,或者改進哪乙個方法?
第二個擴充套件:給出兩個正整數(二進位制形式表示)a和b,問把a變為b需要改變多少位?也就是問a和b的二進位制表示中有多少位是不同的?
對於第乙個擴充套件,打表是肯定不行了,32位的dword打表需要2^32(即4g)個數字,每個數字乙個位元組,一共就要4gb。不過使用第三節中提到的兩個方法都沒問題的,最大的才32次。
對於第二個擴充套件,就是將a與b異或,然後求這個異或的結果中1的個數即可。
5. 參考
程式設計之美,2.1節,求二進位制中1的個數。
程式設計之美2 1 二進位制中1的個數
int numberof 1 int n return count int is 2n int n 1 求這兩個數的異或 兩個數不同的位置都為1,這些位置都需要改變 2 統計異或結果中1的個數 int stepchangeto int m,int n int add int num1,int num...
程式設計之美2 1 求二進位制中1的個數
最近一段的時間,一直在看程式設計之美之類的演算法書籍,剛開始看程式設計之美,感覺到難度太大,有時候也不願意去翻動這本書,不過,經過一段時間的修煉,我也徹底的喜歡上這本書了,書中的演算法涉及到很多方面,樹,鍊錶,位運算,陣列,hash表應用等等。由於最近事情也忙得差不多了,我重新寫了一遍程式設計之美中...
求二進位制中1的個數(程式設計之美2 1)
行文脈絡 解法一 除法 解法二 移位 解法三 高效移位 解法四 查表 擴充套件問題 異或後轉化為該問題 對於乙個位元組 8bit 的變數,求其二進位制 1 的個數。例如6 二進位制0000 0110 1 的個數為2,要求演算法效率盡量高。解法一 對於二進位制數來說,除乙個2,就少一位,可以判斷這個少...