Clanguage第12章位运算.ppt_第1页
Clanguage第12章位运算.ppt_第2页
Clanguage第12章位运算.ppt_第3页
Clanguage第12章位运算.ppt_第4页
Clanguage第12章位运算.ppt_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章 位运算 1. 1. 位运算符及其应用位运算符及其应用 2. 2. 位段及其应用位段及其应用 12.1位运算符和位运算表达式 n n C C语言中提供了如下语言中提供了如下6 6种的位运算符:种的位运算符: return(k); 结论:任何二进制位与0相与能实现置0,与1相与该 位保持不变。 2)“按位或“运算经常用与将某些二进制位 置 1。 例12.4:将一个字节的高4位置为1010并输出结果。 分析:直接用位运算符,可以很方便的置1、清0、翻转等, 但无法直接实现置给定的值。可以用两步实现:首先将高 4位清 0,然后与1010 0000相或。程序如下: /*设 a 为待处理的数据,转换成二进制为00001000 ,b用来保存将a的高4位清0后的结果*/ main() unsigned char a,b,c; a=8; b=a c=b|0xa0; /*c用于保存最终结果*/ printf(%x,c); 运行结果:10101000 3)按位异或运算经常用与将某些位翻转。 例12.5 编程实现,将一整数n的高8位翻转,低8位不变 分析:用“异或”运算实现,即高8位与1相异或,低8位与0相 异或,也就是k与十六进制的ff00相异或。程序如下: main() int n=129; printf(n before reset,n=%x,n); n=n0xff00; printf(n after reset,n=%x,n); 运行结果: before reset,n=00000000 10000001 after reset,n=11111111 10000001 结论:任何二进制位与0异或,保持不变;与1异或,对应 位翻转。 4)4)左移、右移运算实现将一个数的各个二进制位向左、向左移、右移运算实现将一个数的各个二进制位向左、向 右移若干位。右移若干位。 左移:将一个数的各个二进制位左移若干位,高位左移左移:将一个数的各个二进制位左移若干位,高位左移 后舍弃,低位补后舍弃,低位补0 0 。 若定义若定义: : intint a=8; a=8; 即即a=a= 0000 10000000 1000 , , 则语句则语句a=a2 a=a2 ;将将 a a 的各二进制位右移的各二进制位右移 2 2 位,空出的位,空出的 高位补高位补 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 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位空间位空间 空出不使用空出不使用*/*/ intint i ; i ; data; data; n变量data 的存储结构如图 : n a b c i 成员名 n 2 6 4 4 16 长度 3位段的引用 位段是结构体类型的某个成员,因此,位段的引用同结构体 成员的引用方法相同。 如:data.a=0x01; /*给位段a赋值, */ data.b=0x0a; /*给位段b赋值*/ data.i=12; /*给位段 i赋值*/ printf(“%02x, %02x, %4d”, data.a , data.b ,data.i ); 输出: 01, 0a, 12 特别提示:使用位段时,要注意该位段的能表示的数据的范 围。 4位段的应用 编程模拟一个温度测控系统:从键盘输入模拟 温度的采样值(0255),该采样值与0.2相 乘,得出实际温度值,根据该温度值,控制 温度指示灯的亮与灭(从0度开始,温度每增 加10度则多点亮一个指示灯);将该温度值 与设定温度比较,当温度小于10度和高于40 度时分别开启升温设备和降温设备,同时报 警。反复以上过程,直至输入的测温值为300 为止。 分析:系统中需要控制的设备有:五个温度指示灯,升温设 备,降温设备,报警设备。因此可用如下的结构体变量 word表示该系统的控制字,其成员构成如下: (1)无符号整型tem1 用来存放输入的温度采样值(0255 ),若每个刻度代表0.2度,则可以测量的温度范围为 051度。浮点类型的成员tem2用来存放tem1成员转换成 的温度值。 (2)四个位段存放(要输出的)控制数据。其中,位段lmp 宽度为5,控制五个温度指示灯,值为1时灯亮,为0时灯 不亮。其余的3个位段sw1、sw2、alm宽度均为1,分别控 制升温设备、降温设备和报警设备,都是为“1”时开启, 为0时关闭。 函数sample()实现测温采样:通过键盘输入模拟测温数据, 并转换成实际温度值。 函数 control()实现输出控制:通过屏幕显示和喇叭鸣笛的方 式输出温度值、温度级别、设备开关情况和报警状态。 #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; ; main() void sample(struct ctrl_type *wp); void control(struct ctrl_type *wp); struct ctrl_type word; while(1) sample( /*温度采样*/ / *生成温度指示灯控制位*/ word.lmp=(0xfffftem1); if(wp-tem1=300) exit(0); wp-tem2=wp-tem1*0.2; 说明: 1)函数sample()实现测温采样:通过键盘输入 模拟测温数据,并转换成实际温度值。 2)函数 control()实现输出控制:通过屏幕显示 和喇叭鸣笛的方式输出温度值、温度级别、 设备开关情况和报警状态 void 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) pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论