Clanguage第12章位运算.ppt

上传人:壹****1 文档编号:571901337 上传时间:2024-08-12 格式:PPT 页数:16 大小:269.81KB
返回 下载 相关 举报
Clanguage第12章位运算.ppt_第1页
第1页 / 共16页
Clanguage第12章位运算.ppt_第2页
第2页 / 共16页
Clanguage第12章位运算.ppt_第3页
第3页 / 共16页
Clanguage第12章位运算.ppt_第4页
第4页 / 共16页
Clanguage第12章位运算.ppt_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Clanguage第12章位运算.ppt》由会员分享,可在线阅读,更多相关《Clanguage第12章位运算.ppt(16页珍藏版)》请在金锄头文库上搜索。

1、第12章 位运算位运算1. 1. 位运算符及其应用位运算符及其应用2. 2. 位段及其应用位段及其应用 12.1位运算符和位运算表达式位运算符和位运算表达式n nC C语言中提供了如下语言中提供了如下6 6种的位运算符:种的位运算符:& & 按位与按位与按位与按位与| | 按位或按位或按位或按位或 按位异或按位异或按位异或按位异或 右移右移右移右移 按位取反按位取反按位取反按位取反提示:只允许对提示:只允许对整型、字符整型、字符型数据进行位运算,而型数据进行位运算,而实型数据实型数据不能进行位运算。不能进行位运算。1. 1.位运算规则位运算规则位运算规则位运算规则: :例例12.112.1若若

2、 a=a=(1515)1010=(00001111)=(00001111)2 2, b=(80)b=(80)1010=(01010000)=(01010000)1010则则: :a&b=00000000,a|b=01011111,a&b=00000000,a|b=01011111,ab=01011111,a=11110000ab=01011111,a=11110000A AB BA&BA&BA|BA|BABABaa0 00 00 00 00 01 10 01 10 01 11 11 11 10 00 01 11 10 01 11 11 11 10 00 01. 1.位运算的应用:位运算的应用:

3、1 1) 按位与按位与 运算经常用于将某些二进制位运算经常用于将某些二进制位屏蔽掉屏蔽掉。例例12.212.2编写函数:使一个整数编写函数:使一个整数k k中的低中的低4 4位置位置0 0。分析:用分析:用“ “与与” ”运算实现:将运算实现:将k k的低的低4 4位与位与0 0相与,其相与,其他位与他位与1 1相与,即将相与,即将 k k与十六进制的与十六进制的 11101110 相与。相与。程序如下:程序如下:unsignedunsigned int int_set(unsigned_set(unsigned int int k) k) k=k & 0x1110 ; k=k & 0x111

4、0 ; return(k); return(k); 结论:任何二进制位与结论:任何二进制位与结论:任何二进制位与结论:任何二进制位与0 0相与能实现置相与能实现置相与能实现置相与能实现置0 0,与,与,与,与1 1相与该相与该相与该相与该位保持不变。位保持不变。位保持不变。位保持不变。 2 2) 按位或按位或按位或按位或 运算经常用与将某些二进制位运算经常用与将某些二进制位 置置置置 1 1。例例12.4:12.4:将一个字节的高将一个字节的高4 4位置为位置为10101010并输出结果。并输出结果。分析:直接用位运算符,可以很方便的置分析:直接用位运算符,可以很方便的置1 1、清、清0 0、

5、翻转等,但、翻转等,但无法直接实现置给定的值。可以用两步实现:首先将高无法直接实现置给定的值。可以用两步实现:首先将高4 4位位清清0 0,然后与,然后与1010000010100000相或。程序如下:相或。程序如下:/*/*设设设设 a a 为待处理的数据,转换成二进制为为待处理的数据,转换成二进制为为待处理的数据,转换成二进制为为待处理的数据,转换成二进制为0000100000001000,b b用来保存将用来保存将用来保存将用来保存将a a的高的高的高的高4 4位清位清位清位清0 0后的结果后的结果后的结果后的结果*/*/main()main() unsigned char a,b,c;

6、 a=8; unsigned char a,b,c; a=8; b=b=a&0x0fa&0x0f; c=; c=b|0xa0b|0xa0; /*c; /*c用于保存最终结果用于保存最终结果用于保存最终结果用于保存最终结果*/*/printfprintf( (%x%x,c); ,c); 运行结果:运行结果:10101000101010003 3)按位异或运算经常用与将某些位翻转。按位异或运算经常用与将某些位翻转。按位异或运算经常用与将某些位翻转。按位异或运算经常用与将某些位翻转。例例12.512.5编程实现编程实现, ,将一整数将一整数n n的高的高8 8位翻转,低位翻转,低8 8位不变位不变分

7、析:用分析:用“ “异或异或” ”运算实现,即高运算实现,即高8 8位与位与1 1相异或,低相异或,低8 8位与位与0 0相异或,也就是相异或,也就是k k与十六进制的与十六进制的与十六进制的与十六进制的ff00ff00相异或。程序如下:相异或。程序如下:main()main() int int n=129; n=129; printfprintf( (n before reset,n=%xn before reset,n=%x,n);,n);n=nn=n0xff00;0xff00;printfprintf( (n after reset,n=%xn after reset,n=%x,n);,

8、n); 运行结果:运行结果:before reset,n=00000000 10000001before reset,n=00000000 10000001after reset,n=11111111 10000001after reset,n=11111111 10000001 结论:任何二进制位与结论:任何二进制位与结论:任何二进制位与结论:任何二进制位与0 0异或,保持不变;与异或,保持不变;与异或,保持不变;与异或,保持不变;与1 1异或,对应位异或,对应位异或,对应位异或,对应位翻转。翻转。翻转。翻转。4)4)左移、右移运算实现将一个数的各个二进制位向左、向左移、右移运算实现将一个数

9、的各个二进制位向左、向右移若干位。右移若干位。左移:将一个数的各个二进制位左移若干位,高位左移左移:将一个数的各个二进制位左移若干位,高位左移左移:将一个数的各个二进制位左移若干位,高位左移左移:将一个数的各个二进制位左移若干位,高位左移后舍弃,低位补后舍弃,低位补后舍弃,低位补后舍弃,低位补0 0 。若定义若定义若定义若定义: : intint a=8; a=8; 即即即即a=a= 0000 10000000 1000 , , 则语句则语句则语句则语句a=a2a=a2 a=a2 ;将将将将 a a 的各二进制位右移的各二进制位右移的各二进制位右移的各二进制位右移 2 2 位,空出的位,空出的

10、位,空出的位,空出的高位补高位补高位补高位补 0 0。结果为。结果为。结果为。结果为: 0000 00100000 0010 12.2位段 1. 1. 位段的概念位段的概念以以位位位位为单位定义其长度的为单位定义其长度的结构体成员结构体成员。2 2位段的定义位段的定义例例12.612.6若某个控制字长若某个控制字长3232位,分位,分5 5段,每段的长度分别为:段,每段的长度分别为:2 2,6 6,4 4,4 4,1616位位 ;每段存放一个信息,且第;每段存放一个信息,且第4 4段空段空出不用。可用如下结构体类型描述:出不用。可用如下结构体类型描述:structstruct con_word

11、 con_word unsigned a: 2; /* unsigned a: 2; /*位段位段位段位段a a,长度为长度为长度为长度为2*/2*/ unsigned b: 6 ; /*a,b,cunsigned b: 6 ; /*a,b,c为有名位段为有名位段为有名位段为有名位段*/*/ unsigned c: 4;unsigned c: 4; unsigned : 4; /* unsigned : 4; /*该位段为无名位段,表示这该位段为无名位段,表示这该位段为无名位段,表示这该位段为无名位段,表示这4 4位空间位空间位空间位空间空出不使用空出不使用空出不使用空出不使用*/*/ int

12、int i ; i ; data; data; n n变量变量datadata的存储结构如图的存储结构如图 :n n abciabci成员名成员名n n264416264416长度长度 3 3位段的引用位段的引用位段的引用位段的引用 位段是结构体类型的某个成员,因此,位段的引用同结构体成位段是结构体类型的某个成员,因此,位段的引用同结构体成位段是结构体类型的某个成员,因此,位段的引用同结构体成位段是结构体类型的某个成员,因此,位段的引用同结构体成员的引用方法相同。员的引用方法相同。员的引用方法相同。员的引用方法相同。 如:如:如:如:data.a=0x01; data.a=0x01; /*/*

13、给位段给位段给位段给位段a a赋值,赋值,赋值,赋值, */ */ data.b=0x0a; data.b=0x0a; /*/*给位段给位段给位段给位段b b赋值赋值赋值赋值*/*/ data.i=12;data.i=12; /*/*给位段给位段给位段给位段 i i赋值赋值赋值赋值*/*/ printfprintf(“%02x, %02x, %4d”, data.a , data.b ,data.i ); (“%02x, %02x, %4d”, data.a , data.b ,data.i ); 输出:输出:输出:输出: 01, 0 01, 0a, 12a, 12 特别提示:使用位段时,要注

14、意该位段的能表示的数据的范围。特别提示:使用位段时,要注意该位段的能表示的数据的范围。特别提示:使用位段时,要注意该位段的能表示的数据的范围。特别提示:使用位段时,要注意该位段的能表示的数据的范围。4 4位段的应用位段的应用编程模拟一个温度测控系统:从键盘输入模拟温编程模拟一个温度测控系统:从键盘输入模拟温度的采样值(度的采样值(02550255),该采样值与),该采样值与0.20.2相乘,相乘,得出实际温度值,根据该温度值,控制温度指得出实际温度值,根据该温度值,控制温度指示灯的亮与灭(从示灯的亮与灭(从0 0度开始,温度每增加度开始,温度每增加1010度度则多点亮一个指示灯);将该温度值与

15、设定温则多点亮一个指示灯);将该温度值与设定温度比较,当温度小于度比较,当温度小于1010度和高于度和高于4040度时分别开度时分别开启升温设备和降温设备,同时报警。反复以上启升温设备和降温设备,同时报警。反复以上过程,直至输入的测温值为过程,直至输入的测温值为300300为止。为止。分析:系统中需要控制的设备有:五个温度指示灯,升温设备,分析:系统中需要控制的设备有:五个温度指示灯,升温设备,分析:系统中需要控制的设备有:五个温度指示灯,升温设备,分析:系统中需要控制的设备有:五个温度指示灯,升温设备,降温设备,报警设备。因此可用如下的结构体变量降温设备,报警设备。因此可用如下的结构体变量降

16、温设备,报警设备。因此可用如下的结构体变量降温设备,报警设备。因此可用如下的结构体变量wordword表表表表示该系统的控制字,其成员构成如下:示该系统的控制字,其成员构成如下:示该系统的控制字,其成员构成如下:示该系统的控制字,其成员构成如下:(1 1)无符号整型)无符号整型)无符号整型)无符号整型tem1 tem1 用来存放输入的温度采样值(用来存放输入的温度采样值(用来存放输入的温度采样值(用来存放输入的温度采样值(02550255),),),),若每个刻度代表若每个刻度代表若每个刻度代表若每个刻度代表0.20.2度,则可以测量的温度范围为度,则可以测量的温度范围为度,则可以测量的温度范

17、围为度,则可以测量的温度范围为051051度。度。度。度。浮点类型的成员浮点类型的成员浮点类型的成员浮点类型的成员tem2tem2用来存放用来存放用来存放用来存放tem1tem1成员转换成的温度值。成员转换成的温度值。成员转换成的温度值。成员转换成的温度值。(2 2)四个位段存放(要输出的)控制数据。其中,位段)四个位段存放(要输出的)控制数据。其中,位段)四个位段存放(要输出的)控制数据。其中,位段)四个位段存放(要输出的)控制数据。其中,位段lmp lmp 宽度为宽度为宽度为宽度为5 5,控制五个温度指示灯,值为,控制五个温度指示灯,值为,控制五个温度指示灯,值为,控制五个温度指示灯,值为

18、1 1时灯亮,为时灯亮,为时灯亮,为时灯亮,为0 0时灯不时灯不时灯不时灯不亮。其余的亮。其余的亮。其余的亮。其余的3 3个位段个位段个位段个位段sw1sw1、sw2sw2、almalm宽度均为宽度均为宽度均为宽度均为1 1,分别控制升,分别控制升,分别控制升,分别控制升温设备、降温设备和报警设备,都是为温设备、降温设备和报警设备,都是为温设备、降温设备和报警设备,都是为温设备、降温设备和报警设备,都是为“1”“1”时开启,为时开启,为时开启,为时开启,为0 0时时时时关闭。关闭。关闭。关闭。函数函数函数函数sample()sample()实现测温采样:通过键盘输入模拟测温数据,并实现测温采样

19、:通过键盘输入模拟测温数据,并实现测温采样:通过键盘输入模拟测温数据,并实现测温采样:通过键盘输入模拟测温数据,并转换成实际温度值。转换成实际温度值。转换成实际温度值。转换成实际温度值。函数函数函数函数 control()control()实现输出控制:通过屏幕显示和喇叭鸣笛的方式实现输出控制:通过屏幕显示和喇叭鸣笛的方式实现输出控制:通过屏幕显示和喇叭鸣笛的方式实现输出控制:通过屏幕显示和喇叭鸣笛的方式输出温度值、温度级别、设备开关情况和报警状态。输出温度值、温度级别、设备开关情况和报警状态。输出温度值、温度级别、设备开关情况和报警状态。输出温度值、温度级别、设备开关情况和报警状态。# #d

20、efineON1defineON1#defineOFF0#defineOFF0structstructctrl_typectrl_typeunsignedchartem1;unsignedchartem1;floattem2;floattem2;unsignedunsignedlmplmp:5;:5;unsignedsw1:1;unsignedsw1:1;unsignedsw2:1;unsignedsw2:1;unsignedunsignedalmalm:1;:1; ;main()main()void sample(void sample(structstruct ctrl_type * ct

21、rl_type *wpwp); ); void control( void control(structstruct ctrl_type * ctrl_type *wpwp); ); struct struct ctrl_type word; ctrl_type word; while(1) while(1) sample(&word); /*sample(&word); /*温度采样温度采样温度采样温度采样*/*/ / * / *生成温度指示灯控制位生成温度指示灯控制位生成温度指示灯控制位生成温度指示灯控制位*/*/ word.word.lmplmp=(0xffff(=(0xffff(int

22、int)word.tem2/10); )word.tem2/10); /* /*生成升温、降温设备及报警设备的控制位生成升温、降温设备及报警设备的控制位生成升温、降温设备及报警设备的控制位生成升温、降温设备及报警设备的控制位*/*/ if(word.tem210) if(word.tem210) word. word.almalm=ON; word.sw1=ON; word.sw2=OFF; =ON; word.sw1=ON; word.sw2=OFF; else if(word.tem240) else if(word.tem2tem1);-tem1);if(if(wpwp-tem1=300

23、)exit(0);-tem1=300)exit(0);wpwp-tem2=-tem2=wpwp-tem1*0.2;-tem1*0.2; 说明:说明:1 1)函数)函数sample()sample()实现测温采样:通过键盘输入模实现测温采样:通过键盘输入模拟测温数据,并转换成实际温度值。拟测温数据,并转换成实际温度值。2 2)函数)函数 control()control()实现输出控制:通过屏幕显示和实现输出控制:通过屏幕显示和喇叭鸣笛的方式输出温度值、温度级别、设备喇叭鸣笛的方式输出温度值、温度级别、设备开关情况和报警状态开关情况和报警状态 void control(void control(

24、structstruct ctrl_type * ctrl_type *wpwp) )char i,m;char i,m; printf printf(n%6s %6s %4s %4s %6s, degree, lamp, sw1, (n%6s %6s %4s %4s %6s, degree, lamp, sw1, sw2, alarm);sw2, alarm); printf printf(n %6.1f ,(n %6.1f ,wpwp-tem2);-tem2); for(i=0,m=0x10;i=1) for(i=0,m=0x10;i=1) printf printf(%c,(%c,wpw

25、p-lmplmp&m?*: ); &m?*: ); /* /*用用用用*表示温度指示灯亮表示温度指示灯亮表示温度指示灯亮表示温度指示灯亮*/*/ printfprintf(%4s,(%4s,wpwp-sw1?ON:OFF);-sw1?ON:OFF); /* /*用用用用ONON表示开启,用表示开启,用表示开启,用表示开启,用OFFOFF表示关闭表示关闭表示关闭表示关闭*/*/ printfprintf(%4s,(%4s,wpwp-sw2?ON:OFF);-sw2?ON:OFF); printf printf(%6s,(%6s,wpwp-almalm?ONx07:OFFx20);?ONx07:OFFx20);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号