首页 科普 资讯 养生 问答 找医院 相关问答
首页> 问答

Hacker's Delight笔记(3)-位计数

发布网友 发布时间:1天前

我来回答

1个回答

热心网友 时间:1天前

: 非 (ASCII 00AC) ⨁: 异或 (ASCII 2A01) ≡:异或非,即异或再取非 (ASCII 2261) ≫: 有符号右移 (ASCII 226B) ≫U:无符号右移

1. 统计为1的位元数

考虑长度为32bit的整数,现在要统计bit为”1”的个数。这里我们可以利用”分而治之”的策略,将32bit分成两个16bit的部分分别统计。然后再将16bit分成两个8bit,直到粒度为2个bit的情况。

假设x为2bit数,那么x中的1的个数可以表示为(x & 1) + (x >> 1)。对于32bit的整数,第一步先同时对16组2bit数进行操作: x = (x & 0x5555 5555) + ((x >> 1) & 0x5555 5555)。然后,我们想办法再将16组2bit数加成一个数即可: x = (x & 0x3333 3333) + ((x >> 2) & 0x3333 3333)。相邻的2bit数加成4bit数 x = (x & 0x0F0F 0F0F) + ((x >> 4) & 0x0F0F 0F0F)。相邻的4bit数加成8bit数 x = (x & 0x00FF 00FF) + ((x >> 8) & 0x00FF 00FF)。相邻的8bit数加成16bit数 x = (x & 0x0000 FFFF) + ((x >> 16) & 0x0000 FFFF)。相邻的16bit数加成最后的32bit数

简化:

由于最后的结果最大值为32(0x0000 0020),顶多也就使用了6个bit。所以上面的式子应该还可以继续精简。现在我们还是考虑2bit数0bAB = 2*A+B(A,B为1或0)。所以1的个数A+B = 2A+B–A = 0bAB–(0bAB>>1),所以上面第一个式子可以简化成:

x = x – ((x >> 1) & 0x5555 5555)

这里我们把4bit看成一组。假设经过上面的一步,我们从0bABCD得到了0bEFGH。从2bit为单位看,有0bEF = A+B, 0bGH = C+D,从4bit角度看,有0bEFGH = 4*(A+B)+C+D。所以, A+B+C+D=4*(A+B)+C+D-3*(A+B) = 0bEFGH – 3*(0bEFGH >> 2) , 所以第二个式子可以继续优化成:

x = x – 3*((x >> 2) & 0x3333 3333)

接下来的8bit的结果最大为8,最大占用4个字节。所以可以先加,再把多余的bit置零。

x = (x + (x >> 4)) & 0x0F0F 0F0F

由于最终结果顶多占用6bit,所以下面的式子也不用考虑bit相加的进位问题。

x = x + (x >> 8) x = x + (x >> 16)

只需要最后把不需要的bit置零,就得到最后的结果了。

x = x & 0x0000 003F

建表方法优化:

使用建立表格的方式虽然比较暴力,但是在很多地方往往有很好的优化效果。我们先把0~255的结果算出来建表:

table[256] = {0, 1, 1, …, 7, 8}

最后的结果为:table[x & 0xFF] + table[(x >> 8) & 0xFF] + table[(x >> 16) & 0xFF] + table[x >> 24]

2. 奇偶性

如果一个位串中的1的个数为奇数,称之为”奇位串”,否则称为”偶位串”。

我们这里依然主要用”分而治之”的方法,考虑2bit数0bAB,然后取异或A⨁B。0⨁0=0, 1⨁1=0, 1⨁0=1, 0⨁1=1。如果把0看作偶数,1看作奇数,那异或正好满足了奇偶的统计规律。0bAB ⨁ (0bAB >> 1),这样我们就把奇偶的结果存放在了最低位。然后我们把2bit推广到4bit,直到32bit。下面是公式:

y = x ^ (x >> 1); y = y ^ (y >> 2); y = y ^ (y >> 4); y = y ^ (y >> 8); y = y ^ (y >> 16);

奇偶性的结果就在最低位。0代表偶数,1代表奇数。

3. 前导0计数

用二分法搜索计算前导0个数的算法:

如果使用建表的方法,可以用下面的语句替换上面的6~9行. table[256] = {0, 1, 2, 2, …, 8} return n + 7 – table[x >> 24]

4. 后缀0计数

用二分法搜索计算后缀0个数的算法:

如果后缀0的数目比较少,则这种循环的方式更快一些:

此外,还有一种并发执行度较高的代码:
单刀协会是什么意思? 有没有卖好莱坞道具大师刀剑神域武器真的 人都说刀剑有煞气,放在家里不好,请大师帮我看一下,我这把宝剑煞气重吗... 赶尸真的存在吗,我对此真的是非常感兴趣? 孩子冷血无情怎么办 看不惯自己的孩子,总觉得他事事不如我的意,作业不够认真,缺乏灵性,反应... 我的妹妹读不懂数学,语文写作很没灵性,应该怎么培养她的能力 佛山市邮政储蓄银行的劳务派遣工和正式工有何区别? 音响音质好,主要是老主板还是喇叭啊? 2024材料专业真的是坑吗 为什么说材料类专业是天坑专业? 水槽下水配件包括哪些 电力工程常识中QC小组成果类型有哪几类? 网站老域名跳转到新域名 一个正在备案的域名可以跳转到一个已备案的域名上吗? 大学生已经戒烟了,以前抽烟辅导员现在才知道会不会因为以前在校吸烟给... 电脑开机时候到滚条就卡了 电脑开机卡在主板画面进不了bios怎么办? 为什么我的电脑开机一会就会什么都打不开连正常关机或重启也不能用只 ... ...房租都交不起,他知道你刚出来,要压工资,,他这样说什么意思? 说好这个月他交房租的 从十七号拖到现在 问我发工资没有 确实我工资还... 你有哪些记忆深刻的被骗的经历? ...说是交房租的,说最近没钱用,工资年底才发,我只打了5百块钱到他卡... 要是女人说要交房租了,可是工资还没发该怎么回? 什么类型的口子好下款 有什么下款了的口子 什么原因迟发工资 机动车绿灯正常行事,被左侧闯红灯想左转眼的电动车撞上,请问责任怎么划 ... ...路口的时候 我是直行 还是绿等 被电动车闯红灯撞到了 谁的责任_百... 十字路口正常行驶小车跟闯红灯电动车刮擦怎么谁的责任大 磷酸三钠化学性质 r语言输入代码如何运行 大数据分析R语言RStudio使用教程 天使组合成员资料 Rstudio常用快捷键以及窗口操作有用技巧 玩奶块的朋友知道在铭心之界里哪有樱花木林啊,急需要 特别经典的现实语录(一针见血的现实句子) 发明钉钉的人有没有想过老师会拖堂? 刚买了个640块的银镯还没戴就不小心丢了,特别难过,难过了一整天哭了... 哪些开销涉及婚礼预算举办婚礼要花费多少钱 结婚需要准备哪些花销呢? 顺丰寄电子设备不要消毒 顺丰现在寄东西要统一消毒吗? 世界上最安静的旅游城市 "胜利就在眼前,而你却看不到胜利,多么的令人遗憾..."选自哪里?我爸说是... 国务院办公厅关于深化高等学校创新创业教育改革的实施意见的意见 高等学校创业教育经验汇编内容简介 关于深化高等学校创新创业教育改革的实施意见 伯乐奖是什么意思? 期货反向交易浅谈 有没有类似的男生头像,也是这个角度,也是这个画风,也是这样的微笑? 苹果手机通讯录在哪导入 我手机是avi格式下载avi电影为是么不能播放 按规定哪些病需要休假三个月以上 出院医嘱全休三个月是什么意思 win10的设备管理器中,启用鼠标设备提示需要重启? iphone照片转移 iphone照片导出到电脑 斯琴朝克图基本资料 谁有关于奥运的歌曲? 人生第一次简介 wps ppt打印时怎么设置成竖版和页边距 换新的路由器如何设置 写作文可以运用到毕淑敏的那些名句 卖假货是不是犯法 win7电脑桌面图标怎么调小 长江证券什么要求 果绿色的翡翠值钱吗 使用权是两家合用公公面积如果一家卖掉邻一家装修后改为独用买家是否... windows10找不到文件无法卸载软件怎么办 电脑卸载软件时为什么找不到文件 10000米等于几个3米? (2005+2006+2007+2008+2009+2010+2011)÷2008? 9999×222+3333×3334简便运算是多少? 这位老师,您好,关于11111*66666-12222*33333怎么简便算出 苹果11开视频带美颜吗 出口货物发生退运会计分录怎样处? 何为"临"字在古代的各种含义和用法? 什么是汇率的稳定 652啥意思 抚养权归男方,但是女方带可以吗 抚养权归男方但是女方带 如何使用MulTIsim仿真示波器? 水泵的进出水压差如果小于设定时对电流有何影响,对水泵有无伤害。 液压泵的性能参数有哪些 液压泵的使用注意事项是什么 谁来说说轻钢龙骨需要加横撑龙骨吗 心理咨询师报考收费多少钱啊江苏 85年农村信用社贷款,至今20年没还,会影响领结婚证吗 电工证补贴每月都有吗 快递被丰巢快递柜卡住怎么办? 自酿葡萄酒的正确做法和步骤
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com