計算 1 的位數

計算 1 的位數

population function 。例如,數字 37 的二進制形式是 100101,所以它包含有三個設置成 1 的位。一個計算 32 位整數 中 1 的位數的簡單c語言程序是:

 int

 count_ones(unsigned int

 x) {
int i, result = 0;
for (i=0; i<32; i++) {
result += x & 1;
x = x >> 1;
}
return result;
}

不幸的是,這個簡單的算法在現代的架構上將需要數以百計的時鐘週期才能完成,這是因爲它造成了許多分支和循環,而分支的速度是很慢的。這可以使用 loop unrolling 和其它一些聰明的技巧進行改進,但是最簡單快捷的解決方案是查找表:簡單地構建一個 包含每個字節可能值包含的 1 的個數的256 個條目的表。然後使用這個表查找整數中每個字節包含的 1 的個數,並且將結果相加。沒有分支、四次內存訪問、幾乎沒有算術運算,這樣與上面的算法相比就可以大幅度地提升速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章