冬雪雪冬 发表于 2017-6-12 22:21:30

基本数据类型与表达式04 - 零基础入门学习Delphi005

本帖最后由 冬雪雪冬 于 2017-6-14 21:57 编辑

这节课主要学习位运算,说到位运算,就不得不说到二进制。我们说到计算机的存储单位是Byte,但还有更小的Bit,对就是位。一个Byte等于8个Bit。而位运算则是对数字的二进制的每个位做操作。一共有7个位运算符。
位运算符含义
单目运算符
Not对右边操作数的二进制按位取反
双目运算符
And对两个操作数二进制按位与
Or对两个操作数二进制按位或
Xor对两个操作数二进制按位异或
Shl对左边操作数二进制按位左移左边操作数的位
Shr对左边操作数二进制按位左移右边操作数的位
还是用实例说话吧。位运算的操作数只能为整数,为了简单选2个只占1Byte(8bit)的数,即定义成Shortint类型。a:= 124b:=41

Not 178,每位0变1,1变0
a01110010
114
Not a10001101
-115
正好是原数字加一后取反。
a And b,每位都是1为1,否则为0
a01110010
114
b00101001
41
a And b00100000
32

a Or b,每位都是0为0,否则为1
a01110010
114
b00101001
41
a Or b01111011
123

a Xor b,每位不同为1,否则为0
a01110010
114
b00101001
41
a Xor b01011011
91

a Shl 2,每位前移2位,前2位舍掉
a01110010
114
a Shl 211001000
200
Shl 2相当于×4等于456,但前2位舍掉了,即减掉了256,所以等于200
a Shr 1,每位后移1位,最后1位舍掉
a01110010
114
a Shr 200111001
57
Shr 1相当于 div 2等于57
与运算符可以查看数字的二进制某位是1还是0,将这个数与01000000相与,如果等于0则这个数右数第七位是0,反之则为1,即我们常说的“掩码”。同样还可以将小写英文字母的ascii码转换为大写的,因为小写的ascii和大些的相差正好32,我们将小写and 11011111即可,同理大写转小写是大写的ascii or 00100000。Xor可用于将某些位取反,需要取反的位异或1,不需要的异或0。异或后再次相同的异或则恢复原来的数值。
后半部分的编程题是分别做两个计算器程序1的特点是有了位图的背景,方法是加入一个Image控件,并导入图片.同时把Form的BorderStyle的属性改为bsSizeToolWin,这样窗体的大小就固定了,不会被用户改变。
程序2更类似传统的计算器,简化一下,就没有做图像背景。
这里为了判断按下等号时做什么运算,提前使用了case语句。另外这次还把Edit的内容靠右对齐,这个功能delphi没有,就用了windows的API函数。具体的操作如下:SetWindowLong(Edit1.Handle, GWL_STYLE,GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_RIGHT); Edit1.invalidate;ES_RIGHT可以改为ES_LEFT或ES_CENTER。另外通过invalidate使Edit失效再重新生成,使ES_RIGHT生效。另外我们看到了一个Or操作符,可以看出GetWindowLong是个数值,其中有2位代表了对齐方式,通过与ES_RIGHT或操作,在不改变其他位的前题下,修改这2位。(为什么不是以为呢?)由于程序的内容比较长,就作为附件放上来了。

lamjj 发表于 2017-6-14 08:47:32

哇。感觉楼主学的好仔细啊,我是不是太着急了点,我也才开始学,

冬雪雪冬 发表于 2017-6-14 10:04:49

lamjj 发表于 2017-6-14 08:47
哇。感觉楼主学的好仔细啊,我是不是太着急了点,我也才开始学,

我也是刚刚开始学delphi,希望能初步掌握这门语言。

naizhu 发表于 2018-2-25 14:07:47

版主。。可以实现在计算器V3里 加入And Not Or 功能吗?

冬雪雪冬 发表于 2018-2-25 19:49:57

naizhu 发表于 2018-2-25 14:07
版主。。可以实现在计算器V3里 加入And Not Or 功能吗?

很容易实现的,你先试试。

最小的草 发表于 2018-5-17 12:21:53

厉害!

john19997 发表于 2021-8-25 20:53:36

shl和 shr   我都要疯了 为了搞清楚这个.

john19997 发表于 2021-9-13 22:14:17

楼主再说shl和 shr 的时候 笔误. 把我脑袋都弄晕了.
原题和结果都是 十进制
比如 A 等于114   那么 A shl 2    结果就是456    而456的二进制是 111001000
       A 等于114    那么a shr 2结果就是 28    114/4等于28.5    小数则被程序自动忽略了,因为是整数型的.
以下是复制粘贴某大神的 平民化解释
x:=x shl 1 二进制数向左移1位,尾部补1个零,相当于x:=x*2;
x:=x shl 2 二进制数向左移2位,尾部补2个零,相当于x:=x*4;
...
x:=x shl n 二进制数向左移n位,尾部补n个零,相当于x:=x*2^n;

x:=x shr 1 二进制数向右移1位,首部补1个零,相当于x:=x div 2;
x:=x shr 2 二进制数向右移2位,首部补2个零,相当于x:=x div 4;
...
x:=x shr n 二进制数向右移n位,首部补n个零,相当于x:=x div (2^n);
页: [1]
查看完整版本: 基本数据类型与表达式04 - 零基础入门学习Delphi005