variable-precision SWAR算法介绍
BITCOUNT命令是统计一个位数组中非0进制位的数量,数学上称作:”Hanmming Weight“
目前效率最好的为variable-precision SWAR算法,可以常数时间内计算出多个字节的非0数目,算法设计的非常精巧,值得学习。
int swar(uint32_t i)
{
// (A)
i = ( i & 0x55555555) + ((i >> ) & 0x55555555); // (B)
i = (i & 0x33333333) + ((i >> ) & 0x33333333); // (C)
i = (i & 0x0F0F0F0F) + ((i >> ) & 0x0F0F0F0F); // (D)
i = (i * 0x01010101) >> ); return i;
}
原理解释:
(A) 0x55555555 二进制为: 0101 0101 0101 0101 0101 0101 0101 0101, 奇位为1, 偶数为0
如果按照i的二进制表示 b31 b30....... b7 b6 b5 b4 b3 b2 b1 b0
i & 0x55555555 则取出全部的奇数位: 0 b30 ...... 0 b6 0 b4 0 b2 0 b0
(i >> 1) & 0x55555555 则取出偶数位: 0 b31 0 b7 0 b5 0 b3 0 b1
两者相加: + ------------------------------------------
0 (b30+b31) ..... 0 (b6+b7) 0 (b4+b5) 0 (b2+b3) 0 (b0+b1)
原理就是按照二进制2位一个分割,计算该两位的1的数目
(B) 将 (A)步骤按照二进制2位划分的1的数目按照4个bit位进行累加
(C) 将 (B)步骤中1的数目按照8个bit位进行累加
(D) (C)步骤中已经计算出了8bit划分的2进制的数目
如 byte3 byte2 byte1 byte0
y = y3 y2 y1 y0
那么 y * 0x01010101 则实现了 将 y0 y1 y2位和y3位置的累加 则y的值为:
byte3 byte2 byte1 byte0
yn = y3+y2+y1+y0 x2 x1 x0 将yn >> 24位 则得到了 y3+y2+y1+y0 的效果。
variable-precision SWAR算法介绍的更多相关文章
- variable precision SWAR算法
计算二进制形式中1的数量这种问题,在各种刷题网站上比较常见,以往都是选择最笨的遍历方法“蒙混”过关.在了解Redis的过程中接触到了variable precision SWAR算法(以下简称VP-S ...
- H2O中的随机森林算法介绍及其项目实战(python实现)
H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...
- 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍
考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...
- variable-precision SWAR算法:计算Hamming Weight
variable-precision SWAR算法:计算Hamming Weight 转自我的Github 最近看书看到了一个计算Hamming Weight的算法,觉得挺巧妙的,纪录一下. Hamm ...
- KNN算法介绍
KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...
- ISP基本框架及算法介绍
什么是ISP,他的工作原理是怎样的? ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为 ...
- Python之常见算法介绍
一.算法介绍 1. 算法是什么 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输 ...
- RETE算法介绍
RETE算法介绍一. rete概述Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关.Rete是拉丁文,对应英文是net,也就是网络.Rete算法通过形成一个rete网络进行模式匹配,利 ...
- [算法]从一道题引出variable-precision SWAR算法
苏君君出了一道题,是牛客网上面的: 输入一个int型整数,输出该数二进制表示中1的个数.其中负数用补码表示. 其实这道题并不难,大家很容易想到的解法是转成字符串的思路,即如下所示: public st ...
随机推荐
- sql server 有关锁的视图说明 syslockinfo
ransact-SQL 参考 https://msdn.microsoft.com/zh-cn/library/ms179881.aspx syslockinfo 包含有关所有已授权.正在转换和 ...
- Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):1.类型注册]
前言 Autofac Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github. ...
- Linux下NDK编译FFMPEG包含neon参数
FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...
- ssh升级
Openssh升级操作步骤(此方法仅供参考) 1 .开启telnet服务 未避免openssh升级失败,导致ssh无法连接,在升级前首先开启telnet服务. 首先要确定是否安装了telnet 修改配 ...
- 配置安装DVWA
本文地址:http://www.cnblogs.com/go2bed/p/4162313.html —————————————————— 什么是DVWA? Damn Vulnerable Web Ap ...
- HDU 2117 取(2堆)石子游戏【wzf博弈】
题意:威佐夫博弈原型,除了输出先手能不能胜,还要输出先手的第一手选择. 思路:预处理出1000000以内的所有奇异局势.对于每个自然数,其必然是某一个奇异局势的a或者b.故对于一个非奇异局势,必定有一 ...
- windows 如何查看端口占用情况?
原文来自:http://www.iteye.com/topic/1117270 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这 ...
- jmeter 监控服务器的内存,cpu等内容
1.需要下载一个jar包,放入到lib /ext文件中 JMeterPlugins-Standard.jar 2.在服务器上安装 perfmon server agent 这里监控内存我们使用的是: ...
- junit 测试及assert的扩张
@Testpublic void method() 测试注释指示该公共无效方法它所附着可以作为一个测试用例. @Beforepublic void method() Before注释表示,该方法必须在 ...
- uboot 移植遇到的问题及解决方法(转)
http://blog.sina.com.cn/s/blog_988ec60801017iy3.html 一 在commond env_nand.c: In function 'saveenv': ...