欢迎来到天天文库
浏览记录
ID:8995415
大小:192.00 KB
页数:16页
时间:2018-04-14
《位运算简介及实用技巧》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、位运算简介及实用技巧位运算简介及实用技巧(一):基础篇作者:matrix67日期:2007-07-23字体大小:小中大 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake。当然首先我还是从最基础的东西说起。什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,
2、and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6and11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110AND1011---------- 0010 --> 2 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。当然有人会说,这个快了有什么用,计算6and11没有什么实际意义啊。这一系列的文章就将告诉你,位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序。Pascal和C中的位运算符号
3、 下面的a和b都是整数类型,则:C语言
4、 Pascal语言-------+-------------a&b
5、 aandba
6、b
7、 aorba^b
8、 axorb ~a
9、 notaa<
10、 ashlba>>b
11、 ashrb 注意C中的逻辑运算和位运算符号是不同的。520
12、1314=1834,但520
13、
14、1314=1,因为逻辑运算时520和1314都相当于True。同样的,!a和~a也是有区别的。各种位运算的使用 ===1.and运算=== and运算通常用于二进制取位操作,例如一个数and第16页共16页位运算简介及实用技巧1的结果就是
15、取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数. ===2.or运算=== or运算通常用于二进制特定位上的无条件赋值,例如一个数or1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。 ===3.xor运算=== xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。 xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(axorb)xorb
16、=a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520xor19880516=20665500,我就把20665500告诉MM。MM再次计算20665500xor19880516的值,得到1314520,于是她就明白了我的企图。 下面我们看另外一个东西。定义两个符号#和@(我怎么找不到那个圈里有个叉的字符),这两个符号互为逆运算,也就是说(x#y)@y=x。现在依次执行下面三条命令,结果是什么?程序代码x<-x#yy<-x@yx<-x@y 执行了第一句后x变成了x#y。那么第二句实质就是y
17、<-x#y@y,由于#和@互为逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x#y)@x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。 加法和减法互为逆运算,并且加法满足交换律。把#换成+,把@换成-,我们可以写出一个不需要临时变量的swap过程(Pascal)。程序代码procedureswap(vara,b:longint);begin a:=a+b; b:=a-b; a:=a-b;end; 好了,刚才不是说xor的逆运算是它本身吗?于是我们就有了一个看起来非常诡异的swap过程:程序代码procedures
18、wap(vara,b:longint);begin a:=axorb; b:=axorb; a:=axorb;end; ===4.not运算第16页共16页位运算简介及实用技巧=== not运算的定义是把内存中的0和1全部取反。使用not运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差,因为无符号类型的数是用$0
此文档下载收益归作者所有