各种位运算经验(源码用delphi示例)

各种位运算经验(源码用delphi示例)

ID:9002985

大小:38.50 KB

页数:4页

时间:2018-04-14

各种位运算经验(源码用delphi示例)_第1页
各种位运算经验(源码用delphi示例)_第2页
各种位运算经验(源码用delphi示例)_第3页
各种位运算经验(源码用delphi示例)_第4页
资源描述:

《各种位运算经验(源码用delphi示例)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、二进制中的1有奇数个还是偶数个我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1。例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1。vari,x,c:longint;beginreadln(x);c:=0;fori:=1to32dobeginc:=c+xand1;x:=xshr1;end;writeln(cand1);end.但这样的效率并不高,位

2、运算的神奇之处还没有体现出来。同样是判断二进制中1的个数的奇偶性,下面这段代码就强了。你能看出这个代码的原理吗?varx:longint;beginreadln(x);x:=xxor(xshr1);x:=xxor(xshr2);x:=xxor(xshr4);x:=xxor(xshr8);x:=xxor(xshr16);writeln(xand1);end.为了说明上面这段代码的原理,我们还是拿1314520出来说事。1314520的二进制为101000000111011011000,第一次异或操作

3、的结果如下:00000000000101000000111011011000XOR0000000000010100000011101101100---------------------------------------00000000000111100000100110110100得到的结果是一个新的二进制数,其中右起第i位上的数表示原数中第i和i+1位上有奇数个1还是偶数个1。比如,最右边那个0表示原数末两位有偶数个1,右起第3位上的1就表示原数的这个位置和前一个位置中有奇数个1。对这个数进

4、行第二次异或的结果如下:00000000000111100000100110110100XOR000000000001111000001001101101---------------------------------------00000000000110011000101111011001结果里的每个1表示原数的该位置及其前面三个位置中共有奇数个1,每个0就表示原数对应的四个位置上共偶数个1。一直做到第五次异或结束后,得到的二进制数的最末位就表示整个32位数里有多少个1,这就是我们最终想要的

5、答案。计算二进制中的1的个数同样假设x是一个32位整数。经过下面五次赋值后,x的值就是原数的二进制表示中数字1的个数。比如,初始时x为1314520(网友抓狂:能不能换一个数啊),那么最后x就变成了9,它表示1314520的二进制中有9个1。x:=(xand$55555555)+((xshr1)and$55555555);x:=(xand$33333333)+((xshr2)and$33333333);x:=(xand$0F0F0F0F)+((xshr4)and$0F0F0F0F);x:=(xan

6、d$00FF00FF)+((xshr8)and$00FF00FF);x:=(xand$0000FFFF)+((xshr16)and$0000FFFF);为了便于解说,我们下面仅说明这个程序是如何对一个8位整数进行处理的。我们拿数字211(我们班某MM的生日)来开刀。211的二进制为11010011。+---+---+---+---+---+---+---+---+

7、1

8、1

9、0

10、1

11、0

12、0

13、1

14、1

15、<---原数+---+---+---+---+---+---+---+---+

16、10

17、01

18、00

19、10

20、

21、<---第一次运算后+-------+-------+-------+-------+

22、0011

23、0010

24、<---第二次运算后+---------------+---------------+

25、00000101

26、<---第三次运算后,得数为5+-------------------------------+整个程序是一个分治的思想。第一次我们把每相邻的两位加起来,得到每两位里1的个数,比如前两位10就表示原数的前两位有2个1。第二次我们继续两两相加,10+01=11,00+10=10,得到的结

27、果是00110010,它表示原数前4位有3个1,末4位有2个1。最后一次我们把0011和0010加起来,得到的就是整个二进制中1的个数。程序中巧妙地使用取位和右移,比如第二行中$33333333的二进制为00110011001100....,用它和x做and运算就相当于以2为单位间隔取数。shr的作用就是让加法运算的相同数位对齐。二分查找32位整数的前导0个数这里用的C语言,我直接Copy的Hacker'sDelight上的代码。这段代码写成C要好看些,写成Pascal的话会出现很

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。