求二进制中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算法分析

最后那句话很受用:就是这些小得不能再小,基础得不能再基础的地方,决定了我们的水平。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值