位运算简介及实用技巧

位运算简介及实用技巧

ID:8995415

大小:192.00 KB

页数:16页

时间:2018-04-14

位运算简介及实用技巧_第1页
位运算简介及实用技巧_第2页
位运算简介及实用技巧_第3页
位运算简介及实用技巧_第4页
位运算简介及实用技巧_第5页
资源描述:

《位运算简介及实用技巧》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

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

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

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

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