文章目录

  • 参考文章
  • 背景
  • 疑问
  • 解析
    • 1)为什么是0x55...、0x33...,作用或含义是什么?
    • 2)每一次计算之后,n的含义是什么?
    • 3)为什么需要多次处理,处理到哪里为止?

参考文章

https://blog.csdn.net/qq_27575841/article/details/105461223

参考文章中给的比较关键的信息是:
1)算法名称叫移位法
2)算法思想是将value中的所有bit相加

背景


工作中遇到产商sdk的算法,第一次没看懂,看了参考文章(方法四移位法)感觉关键部分写的有点含糊,这边推导一下。

疑问

看完参考文章,我还是有如下疑问(实际上我只看懂了算法名和思想。。):
1)为什么是0x55…、0x33…,作用或含义是什么?移位的作用是什么?
2)每一次计算之后,n的含义是什么?
3)为什么需要多次处理,处理到哪里为止?

解析

1)为什么是0x55…、0x33…,作用或含义是什么?

这边先简单化:

  • 如果是1位二进制,其数值本身即可代表所包含的置位个数如0x1则为1位,0x0则为0位。
  • 如果是2位二进制,则我们可以将其看为两组1位二进制。则置位数量的计算方法为 (n & 0x1) + ((n >> 1) & 0x1);(注意这里n只有2bit)
  • 如果是4位二进制,则我们可以将其看为两组2位二进制。
  • 如果是8位二进制,则我们可以将其看为两组4位二进制。
  • 以此类推。

首先分析0x5(4bit),二进制是0101。则 n = (n & 0x55555555) + ((n >> 1) & 0x55555555); 这个算式可以解读为在每个4bit的范围内,以2bit为一组,计算出该4bit内的每个2bit组的置位数,存储在各组所占用的2bit位置上
其次分析0x3(4bit),二进制是0x11,则 n = (n & 0x33333333) + ((n >> 2) & 0x33333333); 这个算式可以解读为位每个4bit的范围内,以4bit位一组,计算出该4bit内的第0组2bit和第一组2bit的和,存储在各组的所占用的4bit位置上
以此类推。

2)每一次计算之后,n的含义是什么?

从上面可以看出,我们不应该把n作为一个整体数值去看,而应该将其上的不同bit位看做是多个1bit组、2bit组、4bit组等等内置位数量的临时存储。

3)为什么需要多次处理,处理到哪里为止?

从1中的推算中可以看出:
第0次计算(即n本身的数值),n的每1bit组,存储的是该1bit内置位的个数。
第1次计算,n的每2bit组存储的是原来该2bit内置位的个数。
第2次计算,n的每4bit组存储的是原来该4bit内置位的个数。
以此类推。

我们会发现,第i次计算,那么以 2i bit为一组的bit位上存储的就是原来这 2i bit位上置位的个数。因此只需要让 2i ==(n的bit数),即可得出i的个数。

计算变量中置位的bit数相关推荐

  1. matlab求点介数程序,matlab_bgl 一个很有用的计算网络中每个节点介数的程序,对 分析 Cloud Computing 云 266万源代码下载- www.pudn.com...

    文件名称: matlab_bgl下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Others 文件大小: 2098 KB 上传时间: 2016-10-26 下载次数: 0 提 供 者 ...

  2. 计算项目中的代码行数:Count the Lines of Code (LOC)

    很多时候打开一个大的项目工程时,我们会想知道这个项目有多少行代码. Visual Studio 自带这个功能,在分析->窗口->代码度量值结果,但是这个功能比较耗时,因为同时分析了代码的耦 ...

  3. python程序中怎样数个数_python3中的代码行数是怎么计算的?

    作为一个编程人员,每天除了测试外,很大一部分的时间都在敲代码中度过.那么有没有人想过我们写的代码到底有多少行呢?逐条去查数目显然是不现实的,不说浪费了大量的时间,而且我们人工的查数会出现失误,一行行密 ...

  4. C语言 计算一串字符中出现的数字字符数

    getchar 函数的功能是读取字符串并将其返回.输入结束或读取过程中发生错误时,就会返回EOF值. #include <stdio.h>int main(void){int i, str ...

  5. PTA11、 输入输出-计算字符串中的数 (10 分)

    11. 输入输出-计算字符串中的数 (10 分) 将字符串中的每个数都抽取出来,然后统计所有数的个数并求和. 输入格式: 一行字符串,字符串中的数之间用1个空格或者多个空格分隔. 输出格式: 第1行: ...

  6. 如何用python计算excel两行之间的差值_excel表格求两列数据差值-怎样在EXCEL表格中求两列数的差?...

    怎样在EXCEL表格中求两列数的差? 1.双击打开需行求差的Excel表格,Excel表格. 2.在进入Excel表格后,使用鼠标需差的单元格,先选中其中一行即可. 3.在选中一行后,在单元格内输入& ...

  7. 计算机如何网络计算,如何计算网络中边的介数?

    Oracle工具家族手册 Oracle Designer 一个基于共享信息仓储的建模和生成工具,设计和建立应用与数椐库定义的高效开发环境 Oracle Developer 一个用于建立企业级客户/服务 ...

  8. R语言使用epiDisplay包的summ函数计算dataframe中指定变量在不同分组变量下的描述性统计汇总信息并可视化有序点图、自定义cex.main参数配置标题文本字体的大小

    R语言使用epiDisplay包的summ函数计算dataframe中指定变量在不同分组变量下的描述性统计汇总信息并可视化有序点图.自定义cex.main参数配置标题文本字体的大小(名称.有效值个数. ...

  9. R语言使用epiDisplay包的summ函数计算dataframe中指定变量的描述性统计汇总信息并可视化有序点图、通过dot.col参数配置数据点的颜色(名称、有效值个数、均值、中位数、标准差)

    R语言使用epiDisplay包的summ函数计算dataframe中指定变量的描述性统计汇总信息并可视化有序点图.通过dot.col参数配置数据点的颜色(名称.有效值个数.均值.中位数.标准差.最大 ...

最新文章

  1. vim编辑二进制文件
  2. php无法将值传入数据库,PHP-无法将句子插入数据库
  3. python详细安装教程linux-Linux(Ubuntu)系统安装Python
  4. 两张图看懂GDT、GDTR、LDT、LDTR的关系
  5. swap 将硬盘变内存
  6. 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
  7. 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、和运算符重载...
  8. 3n+1b 备忘录方法
  9. 五子棋java百度贴吧_五子棋单机版
  10. mysql中delete,truncate,drop区别
  11. JS学习总结(5)——循环语句
  12. 推荐系统实践学习笔记(一)
  13. ZXECS-IBX1000综合业务交换
  14. 如何通过几何画板学这些定理
  15. learnopengl——HDR——完结
  16. oracle职工工资数据表四表联动,oracle 学习之基础篇(四):多表查询
  17. Unity3D休闲射击类游戏《Survival Shooter》完整源码
  18. openstack-nova-api源码剖析1
  19. 集中式版本控制器和分布式版本控制器的个人理解
  20. 用计算机弹精灵宝可梦音乐,《精灵宝可梦》图鉴402:可以演奏出优美音乐的精灵——音箱蟀...

热门文章

  1. tar的c++版本入门教程
  2. NYOJ-779 兰州烧饼
  3. 软件构造期末考点复习
  4. 推荐6款私人珍藏的良心Windows软件
  5. notepad 记事本的问题
  6. SpringBoot (二) 整合前端模板引擎FreeMarker、thymeleaf
  7. 旁路由设置的正确方式
  8. Python数据分析与挖掘————图像的处理
  9. [ Hadoop 3.2.1 官方文档 ] Hadoop 开启 Kerberos 安全模式
  10. 横河EJA210E-JHS5J-910DN-EH23B2WE03-B变送器