族谱网 头条 人物百科

汉明重量

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:576
转发:0
评论:0
历史及应用汉明重量是以理查德·卫斯里·汉明的名字命名的,它在包括信息论、编码理论、密码学等多个领域都有应用。高效实现在密码学以及其它应用中经常需要计算数据位中1的个数,针对如何高效地实现人们已经广泛地进行了研究。一些处理器使用单个的命令进行计算,另外一些根据数据位向量使用并行运算进行处理。对于没有这些特性的处理器来说,已知的最好解决办法是按照树状进行相加。例如,要计算二进制数A=0110110010111010中1的个数,这些运算可以表示为:这里的运算是用C语言表示的,所以X>>Y表示X右移Y位,X&Y表示X与Y的位与,+表示普通的加法。基于上面所讨论的思想的这个问题的最好算法列在这里://typesandconstantsusedinthefunctionsbelowtypedefunsigned__int64uint64;//assumethisgives64-bitsconstuin...

历史及应用

汉明重量是以理查德·卫斯里·汉明的名字命名的,它在包括信息论、编码理论、密码学等多个领域都有应用。

高效实现

在密码学以及其它应用中经常需要计算数据位中1的个数,针对如何高效地实现人们已经广泛地进行了研究。一些处理器使用单个的命令进行计算,另外一些根据数据位向量使用并行运算进行处理。对于没有这些特性的处理器来说,已知的最好解决办法是按照树状进行相加。例如,要计算二进制数A=0110110010111010中1的个数,这些运算可以表示为:

这里的运算是用C语言表示的,所以X >> Y表示X右移Y位,X & Y表示X与Y的位与,+表示普通的加法。基于上面所讨论的思想的这个问题的最好算法列在这里:

//types and constants used in the functions belowtypedefunsigned__int64uint64;//assume this gives 64-bitsconstuint64m1=0x5555555555555555;//binary: 0101...constuint64m2=0x3333333333333333;//binary: 00110011..constuint64m4=0x0f0f0f0f0f0f0f0f;//binary: 4 zeros, 4 ones ...constuint64m8=0x00ff00ff00ff00ff;//binary: 8 zeros, 8 ones ...constuint64m16=0x0000ffff0000ffff;//binary: 16 zeros, 16 ones ...constuint64m32=0x00000000ffffffff;//binary: 32 zeros, 32 ones ...constuint64hff=0xffffffffffffffff;//binary: all onesconstuint64h01=0x0101010101010101;//the sum of 256 to the power of 0,1,2,3...//This is a naive implementation, shown for comparison,//and to help in understanding the better functions.//It uses 24 arithmetic operations (shift, add, and).intpopcount_1(uint64x){x=(x&m1)+((x>>1)&m1);//put count of each 2 bits into those 2 bits x=(x&m2)+((x>>2)&m2);//put count of each 4 bits into those 4 bits x=(x&m4)+((x>>4)&m4);//put count of each 8 bits into those 8 bits x=(x&m8)+((x>>8)&m8);//put count of each 16 bits into those 16 bits x=(x&m16)+((x>>16)&m16);//put count of each 32 bits into those 32 bits x=(x&m32)+((x>>32)&m32);//put count of each 64 bits into those 64 bits returnx;}//This uses fewer arithmetic operations than any other known //implementation on machines with slow multiplication.//It uses 17 arithmetic operations.intpopcount_2(uint64x){x-=(x>>1)&m1;//put count of each 2 bits into those 2 bitsx=(x&m2)+((x>>2)&m2);//put count of each 4 bits into those 4 bits x=(x+(x>>4))&m4;//put count of each 8 bits into those 8 bits x+=x>>8;//put count of each 16 bits into their lowest 8 bitsx+=x>>16;//put count of each 32 bits into their lowest 8 bitsx+=x>>32;//put count of each 64 bits into their lowest 8 bitsreturnx&0xff;}//This uses fewer arithmetic operations than any other known //implementation on machines with fast multiplication.//It uses 12 arithmetic operations, one of which is a multiply.intpopcount_3(uint64x){x-=(x>>1)&m1;//put count of each 2 bits into those 2 bitsx=(x&m2)+((x>>2)&m2);//put count of each 4 bits into those 4 bits x=(x+(x>>4))&m4;//put count of each 8 bits into those 8 bits return(x*h01)>>56;//returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... }

在最坏的情况下,上面的实现是所有已知算法中表现最好的。但是,如果已知大多数数据位是0的话,那么还有更快的算法。这些更快的算法是基于这样一种事实即X与X-1相与得到的最低位永远是0。例如:

减1操作将最右边的符号从0变到1,从1变到0,与操作将会移除最右端的1。如果最初X有N个1,那么经过N次这样的迭代运算,X将减到0。下面的算法就是根据这个原理实现的。

//This is better when most bits in x are 0//It uses 3 arithmetic operations and one comparison/branch per "1" bit in x.intpopcount_4(uint64x){uint64count;for(count=0;x;count++)x&=x-1;returncount;}//This is better if most bits in x are 0.//It uses 2 arithmetic operations and one comparison/branch per "1" bit in x.//It is the same as the previous function, but with the loop unrolled.#define f(y) if ((x &= x-1) == 0) return y;intpopcount_5(uint64x){if(x==0)return0;f(1)f(2)f(3)f(4)f(5)f(6)f(7)f(8)f(9)f(10)f(11)f(12)f(13)f(14)f(15)f(16)f(17)f(18)f(19)f(20)f(21)f(22)f(23)f(24)f(25)f(26)f(27)f(28)f(29)f(30)f(31)f(32)f(33)f(34)f(35)f(36)f(37)f(38)f(39)f(40)f(41)f(42)f(43)f(44)f(45)f(46)f(47)f(48)f(49)f(50)f(51)f(52)f(53)f(54)f(55)f(56)f(57)f(58)f(59)f(60)f(61)f(62)f(63)return64;}//Use this instead if most bits in x are 1 instead of 0#define f(y) if ((x |= x+1) == hff) return 64-y;

参见

汉明距离


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 重量
日常生活在日常生活中,人们俗称质量为"重量",但仍使用质量的单位︰克、公斤或磅。关于两者的比较,参见质量对重量。太阳系物体重量比较根据万有引力定律,相同质量的物质受到引力大小的不同,所产生的重量也不同,以下列出质量1公斤的物质在太阳系各星球上所测得的相对重量:参见重力质量
· 重量级
拳击根据主要职业拳击组织的规定,200磅(90公斤)以上被划为重量级,这也是职业拳击中最高的体重级别。乔·路易斯保持着该级别连续卫冕的纪录,他曾25次成功卫冕拳王头衔。同时,这也是整个职业拳击历史上的最长卫冕纪录。现任重量级世界拳王踢拳在踢拳运动中,重量级通常为196磅(88公斤)至220磅(100公斤)。而根据国际踢拳联合会规定,职业与业余踢拳的巡洋舰级划分标准为215.1磅至235磅(97.8公斤至106.8公斤)。综合格斗在综合格斗中,重量级的标准为205磅至265磅(93公斤至120公斤)。参考文献
· 质量对重量
综述物质的质量极大地影响许多常见的动力学性质。在自然科学外,一般情况下,质量用以描述某物有多“重”。然而,事实上质量描述物体的惯性;也就是说,物体在不受外力下保持匀速运动的趋势。根据牛顿运动定律以及牛顿本人的研究结果总结出来的公式F=m""a,,质量m为1kg的物体在受到1N的力时,获得的加速度是1ms(约是重量加速度的10.2%)。观察保龄球的球瓶在光滑的水平面上被保龄球推倒,可以体会惯性的存在。球瓶受到的水平的推力,与保龄球的方向为向下的重力-体现为必须对其施力才能使其离开地面-完全不同。另外,值得注意的是,在月球上的引力是地球上的六分之一,而物体的质量却保持不变;尽管“反冲动力学”(质量、速度、惯性、“弹性碰撞”与“非弹性碰撞”)的因素占有统治地位,而引力的因素显得微不足道,却物体的行为没有很大的变化。例如同样地在月球上打桌球,球反弹的速度与在地球上并无二致;唯一的区别是,球落入球袋...
· 重量摩尔浓度
单位国际单位制中,重量摩尔浓度的单位是mol/kg。重量摩尔浓度为3mol/kg的溶液可表示为“3molal”或“3m”。但是随着国际单位制的使用,美国在量度方面的权威机构美国国家标准技术研究所认为“molal”和单位符号“m”已经过时,建议使用mol/kg及其相关国际单位制的单位来表示。举例将1.0mol的食盐溶解在2.0kg的水中,所得盐溶液的重量摩尔浓度m(NaCl)=0.50mol/kg。向这个盐溶液中再加入糖后食盐溶液的重量摩尔浓度不变。使用注意事项优点与体积摩尔浓度或质量浓度相比,配制一定重量摩尔浓度的溶液相对简单:只需准确称量溶剂和溶质的质量即可,而无需测量体积,所以浓度不受温度和压力变化的影响,这是一个质量摩尔浓度的优点。相关换算在下文中,溶剂作为溶液的其它成分可以得到与溶质相同的对待,比如对于没有溶质仅有溶剂的溶液,它的重量摩尔浓度b0就是溶剂分子摩尔质量M0的倒数:质量...
· 世界重量级冠军
历史起源各项世界重量级冠军演变图首任世界重量级冠军TripleH世界重量级冠军于2002年成立,由艾瑞克·比绍夫(英语:EricBischoff)宣布由TripleH成为首任冠军。然而,世界重量级冠军的历史传统可追溯到隶属旗下有各个促进联盟国家摔角联盟(英语:NationalWrestlingAlliance)(NWA)的世界重量级摔角冠军。在1980年代后期,隶属国家摔角联盟的吉姆·克罗基特促进联盟(英语:JimCrockettPromotions)(JimCrockettPromotions)被已经收购国家摔角联盟许多促进联盟的透纳广播公司所收购,并改为世界冠军摔角(WCW)。在这段期间,世界冠军摔角以NWA世界重量级冠军(英语:NWAWorldHeavyweightChampionship)做为世界冠军项目。1991年,WCW世界重量级冠军正式创立并由当时NWA世界重量级冠军瑞克·福...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信