位运算基础篇

位运算基础篇

ID:46895305

大小:59.50 KB

页数:5页

时间:2019-11-29

位运算基础篇_第1页
位运算基础篇_第2页
位运算基础篇_第3页
位运算基础篇_第4页
位运算基础篇_第5页
资源描述:

《位运算基础篇》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、位运算简介及实用技巧基础篇什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存屮的二进制位进行操作。比如,and运算木来是一个逻辑运算符,但整数与整数Z间也可以进行and运算。举个例了,6的二进制是110,11的二进制是1011,那么6and11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示Tee,空位都当0处S):110AND10110010->2由于位运算肓接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。当然有人会说,这个快了有什么

2、用,计算6and11没有什么实际意义啊。这-•系列的文章就将告诉你,位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序。Pascal和C中的位运算符号F面的a和b都是整数类型,则:C语言丨Pascal语言+a&bIaandbaIbIaorbaAbIaxorb~aInotaa«bIashlba»bIashrb注意C中的逻辑运算和位运算符号是不同的。52011314=1834,但520111314=1,因为逻辑运算时520和1314都相当于True。同样的,!a和〜a也是有区别的。各种位运算的使用===1.an

3、d运算===and运算通常用于二进制取位操作,例如一个数and1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为()表示该数为偶数,最末位为1表示该数为奇数.===2.oi'运算===or运算通常用于二进制特定位上的无条件赋值,例如一个数or1的结果就是把二进制最末位强行变成1。如果需耍把二进制最末位变成(),对这个数orlZ后再减一就对以了,其实际意义就是把这个数强行变成最接近的偶数。===3.xor运算===xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不

4、变,异或1则取反。xor运算的逆运算是它木身,也就是说两次异或同一个数授后结果不变,即(axorb)xorb=aoxoi■运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520xor19880516=20665500,我就把20665500告诉MMoMM再次计算20665500xor19880516的值,得到1314520,于是她就明白了我的企图。下面我们看另外一个东西。定义两个符号#和@(我怎么找不到那个圈里有个叉的字符),这两个符号互为逆运算

5、,也就是说(x#y)@y=x0现在依次执行下面三条命令,结果是什么?程序代码xv・x#yyv_x@yxv-x@y执行了第一句示X变成了x#y。那么第二句实质就是yv・x#y@y,由于#和@互为逆运算,那么此时的y变成了原来的X。第三句中x实际上被赋值为(x#y)@x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。加法和减法互为逆运算,并且加法满足交换律。把#换成+,把@换成・,我们可以写出一个不需要临时变量的swap过程(Pascal)。程序代码procedureswap(vara

6、,b:longint);begina:=a+b;b:=a-b;a:=a-b;end;好了,刚才不是说xor的逆运算是它本身吗?于是我们就有了一个看起來非常诡界的swap过程:程序代码procedureswap(vara,b:longint);begina:=axorb;b:=axorb;a:=axorb;end;===4.not运算===not运算的定义是把内存中的()和1全部取反。使用not运算时要格外小心,你需要注意整数类型有没有符号。如來not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差,因为

7、无符号类型的数是用$0000至IJSFFFF依次表示的。下面的两个程序(仅语言不同)均返回65435。程序代码vara:word;begina:=100;a:=nota;writeln(a);end.程序代码#includeintmain(){unsignedshorta=100;a=〜a;printf("%d",a)return0;如果not的对象是有符号的整数,情况就不一样了,稍后我们会在“整数类型的储存”小节中提到。===5.shl运算===ashlb就表示把a转为二进制后左移b位(在后血添b个0

8、)。例如100的二进制为1100100,而110010000转成十进制是400,那么100shl2=400o可以看出,ashlb的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以20通常认为ashl1比a*2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽

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

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

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