delphi 位运算简介及实用技巧

delphi 位运算简介及实用技巧

ID:5420202

大小:245.38 KB

页数:11页

时间:2017-12-10

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

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

1、位运算简介及实用技巧去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake。当然首先我还是从最基础的东西说起。什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可

2、以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6and11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理):110AND1011----------0010-->2由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。当然有人会说,这个快了有什么用,计算6and11没有什么实际意义啊。这一系列的文章就将告诉你,位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序。Pascal和C中的位运算符号,下面的a和b都是整数类

3、型,则:C语言Pascal语言按位与a&baandb按位或a

4、baorb异或a^baxorb取反~anota左移位a<>bashrb注意C中的逻辑运算和位运算符号是不同的。520

5、1314=1834,但520

6、

7、1314=1,因为逻辑运算时520和1314都相当于True。同样的,!a和~a也是有区别的。各种位运算的使用:===1.and运算===and运算通常用于二进制取位操作,例如一个数and1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数

8、为奇数.===2.or运算===or运算通常用于二进制特定位上的无条件赋值,例如一个数or1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。===3.xor运算===xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(axorb)xorb=a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人

9、知道,于是双方约定拿我的生日19880516作为密钥。1314520xor19880516=20665500,我就把20665500告诉MM。MM再次计算20665500xor19880516的值,得到1314520,于是她就明白了我的企图。下面我们看另外一个东西。定义两个符号#和@(我怎么找不到那个圈里有个叉的字符),这两个符号互为逆运算,也就是说(x#y)@y=x。现在依次执行下面三条命令,结果是什么?CODE:x<-x#yy<-x@yx<-x@y执行了第一句后x变成了x#y。那么第二句实质就是y<-x#y@y,由于#和@互为

10、逆运算,那么此时的y变成了原来的x。第三句中x实际上被赋值为(x#y)@x,如果#运算具有交换律,那么赋值后x就变成最初的y了。这三句话的结果是,x和y的位置互换了。加法和减法互为逆运算,并且加法满足交换律。把#换成+,把@换成-,我们可以写出一个不需要临时变量的swap过程(Pascal)。CODE:procedureswap(vara,b:longint);begina:=a+b;b:=a-b;a:=a-b;end;好了,刚才不是说xor的逆运算是它本身吗?于是我们就有了一个看起来非常诡异的swap过程:CODE:proced

11、ureswap(vara,b:longint);begina:=axorb;b:=axorb;a:=axorb;end;===4.not运算===not运算的定义是把内存中的0和1全部取反。使用not运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差,因为无符号类型的数是用$0000到$FFFF依次表示的。下面的两个程序(仅语言不同)均返回65435。CODE:vara:word;begina:=100;a:=nota;writeln(a);end;CO

12、DE:#includeintmain(){unsignedshorta=100;a=~a;printf("%d",a);return0;}如果not的对象是有符号的整数,情况就不一样了,稍后我们会在“整数类型的储存”小节中提到

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

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

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