求二進制中1的個數之——HAKMEM算法

問題:求一個整數的二進制中1的個數。

方案一:

select @i:= 50 i,@i_bin:=bin(@i) i_bin, length(@i_bin)-length(replace(@i_bin,'1','')) len_1;

方案二:

select @i:= 50, @tmp:=@i - ((@i >> 1) & 3681400539) - ((@i >>2) & 1227133513) tmp,
((@tmp + (@tmp >>3)) & 3340530119) %63 len_1;

方案一很簡單,思想就是遍歷一遍二進制串對1計數累加。方案二用的是HAKMEM算法,其背後有很複雜的數學推導,參見:MIT HAKMEM算法分析

最後那句話很受用:就是這些小得不能再小,基礎得不能再基礎的地方,決定了我們的水平。

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