第12章位运算

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

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

1、程序设计基础程序设计基础C语言程序设计福州大学软件学院电子教案1第12章 位运算21. 1.位运算符及其应用位运算符及其应用2. 2.位段及其应用位段及其应用 312.1 位运算符和位运算表达式n nC C语言中提供了如下语言中提供了如下6 6种的位运算符:种的位运算符:return(k); 结论:任何二进制位与0相与能实现置0,与1相与 该位保持不变。 62)“按位或”运算经常用于将某些二进制位 置 1。 例12.4:将一个字节的高4位置为1010并输出结果。 分析:直接用位运算符,可以很方便的置1、清0、翻转等, 但无法直接实现置给定的值。可以用两步实现:首先将高 4位清 0,然后与101

2、0 0000相或。程序如下: /*设 a 为待处理的数据,转换成二进制为00001000 ,b用来保存将a的高4位清0后的结果*/ main() unsigned char a,b,c; a=8; b= a c= b | 0xa0 ; /*c用于保存最终结果 */ printf(%x,c); 运行结果:a8 (即二进制数:10101000)73)按位异或运算经常用于将某些位翻转。 例12.5 编程实现,将一整数n的高8位翻转,低8位不变 分析:用“异或”运算实现,即高8位与1相异或,低8位 与0相异或,也就是k与十六进制的ff00相异或。程序 如下: main() int n=129; pri

3、ntf(n before reset,n=%x,n); n=n0xff00; printf(n after reset,n=%x,n); 运行结果: before reset,n=81(即二进制数:00000000 10000001) after reset,n=ff81(即二进制数:11111111 10000001 ) 结论:任何二进制位与0异或,保持不变;与1异或, 对应位翻转。84)4)左移、右移运算实现将一个数的各个二进制位向左、向右左移、右移运算实现将一个数的各个二进制位向左、向右 移若干位。移若干位。左移:左移:将一个数的各个二进制位左移若干位,高位左移后舍将一个数的各个二进制位

4、左移若干位,高位左移后舍 弃,低位补弃,低位补0 0 。若定义若定义: : int int a=8;a=8; 即即 a a= = 0000 0000 0000 10000000 0000 0000 1000, , 则语句则语句a=a2 a=a2 ;即为将即为将 a a 的各二进制位右移的各二进制位右移 2 2 位,空出的位,空出的 高位补高位补 0 0。结果为。结果为: 0000 0000 0000 0000 0000 0000 0010 0010912.2 位段1.1. 位段的概念位段的概念 以以位位为单位定义其长度的为单位定义其长度的结构体成员结构体成员。 2 2位段的定义位段的定义 例例

5、12.612.6若某个控制字长若某个控制字长3232位,分位,分5 5段,每段的长度分别为:段,每段的长度分别为:2 2 ,6 6 ,4 4 ,4 4 ,1616位位 ;每段存放一个信息,且第;每段存放一个信息,且第4 4段空出不段空出不 用。可用如下结构体类型描述:用。可用如下结构体类型描述: structstruct con_word con_word unsigned a: 2; /* unsigned a: 2; /*位段位段a a,长度为长度为2*/2*/unsigned b: 6 ; /*a,b,cunsigned b: 6 ; /*a,b,c为有名位段为有名位段* */ /uns

6、igned c: 4;unsigned c: 4;unsigned : 4; unsigned : 4; /* /*该位段为无名位段,表示这该位段为无名位段,表示这4 4位空间空出不使用位空间空出不使用* */ /int int i ; i ; data; data; 10l变量data 的存储结构如图 :l a b c i 成员 名 l 2 6 4 4 16 长度3位段的引用位段是结构体类型的某个成员,因此,位段的引用同结构 体成员的引用方法相同。如:data.a=0x01; /*给位段a赋值, */data.b=0x0a; /*给位段b赋值*/data.i=12; /*给位段 i赋值*/p

7、rintf(“%2x, %2x, %4d”, data.a , data.b ,data.i ); 输出: 1, a, 12特别提示:使用位段时,要注意该位段的能表示的数据的 范围。114位段的应用(兴趣者学习) 编程模拟一个温度测控系统:从键盘输入模拟 温度的采样值(0255),该采样值与0.2相 乘,得出实际温度值,根据该温度值,控制 温度指示灯的亮与灭(从0度开始,温度每增 加10度则多点亮一个指示灯);将该温度值 与设定温度比较,当温度小于10度和高于40 度时分别开启升温设备和降温设备,同时报 警。反复以上过程,直至输入的测温值为 300为止。12分析:系统中需要控制的设备有:五个温

8、度指示灯,升温设 备,降温设备,报警设备。因此可用如下的结构体变量 word表示该系统的控制字,其成员构成如下: (1)无符号整型tem1 用来存放输入的温度采样值(0255 ),若每个刻度代表0.2度,则可以测量的温度范围为 051度。浮点类型的成员tem2用来存放tem1成员转换成 的温度值。 (2)四个位段存放(要输出的)控制数据。其中,位段 lmp 宽度为5,控制五个温度指示灯,值为1时灯亮,为0 时灯不亮。其余的3个位段sw1、sw2、alm宽度均为1, 分别控制升温设备、降温设备和报警设备,都是为“1”时 开启,为0时关闭。 函数sample()实现测温采样:通过键盘输入模拟测温数

9、据, 并转换成实际温度值。 函数 control()实现输出控制:通过屏幕显示和喇叭鸣笛的 方式输出温度值、温度级别、设备开关情况和报警状态。13#define ON 1 #define OFF 0 struct ctrl_type unsigned char tem1;float tem2;unsigned lmp:5;unsigned sw1:1;unsigned sw2:1;unsigned alm:1; ;14main() void sample(struct ctrl_type *wp);void control(struct ctrl_type *wp);struct ctrl_t

10、ype word;while(1)sample( /*温度采样*/ *生成温度指示灯控制位*/word.lmp=(0xfffftem1); if(wp-tem1=300) exit(0);wp-tem2=wp-tem1*0.2; 说明: 1)函数sample()实现测温采样:通过键盘输 入模拟测温数据,并转换成实际温度值。 2)函数 control()实现输出控制:通过屏幕显 示和喇叭鸣笛的方式输出温度值、温度级别 、设备开关情况和报警状态 16void control(struct ctrl_type *wp) char i,m;printf(“n%6s %6s %4s %4s %6s“, “degree“, “lamp“, “sw1“, “sw2“, “alarm“);printf(“n %6.1f “,wp-tem2);for(i=0,m=0x10;i=1)printf(“%c“,wp-lmp /*用*表示温度指示灯亮*/printf(“%4s“,wp-sw1?“ON“:“OFF“);/*用ON表示开启,用OFF表示关闭*/printf(“%4s“,wp-sw2?“ON“:“OFF“);printf(“%6s“,wp-alm?“ONx07“:“OFFx20“); 17

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

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