C++课件:第12章位运算.ppt

上传人:san****019 文档编号:19954976 上传时间:2021-01-18 格式:PPT 页数:16 大小:270.42KB
收藏 版权申诉 举报 下载
C++课件:第12章位运算.ppt_第1页
第1页 / 共16页
C++课件:第12章位运算.ppt_第2页
第2页 / 共16页
C++课件:第12章位运算.ppt_第3页
第3页 / 共16页
资源描述:

《C++课件:第12章位运算.ppt》由会员分享,可在线阅读,更多相关《C++课件:第12章位运算.ppt(16页珍藏版)》请在装配图网上搜索。

1、C+第 12章 位运算 1. 位运算符及其应用 2. 位段及其应用 12.1位运算符和位运算表达式 C语言中提供了如下 6种的位运算符: return(k); 结论:任何二进制位与 0相与能实现置 0,与 1相与该 位保持不变。 2) 按位或 运算经常用与将某些二进制位 置 1。 例 12.4:将一个字节的高 4位置为 1010并输出结果。 分析:直接用位运算符,可以很方便的置 1、清 0、翻转等,但 无法直接实现置给定的值。可以用两步实现:首先将高 4位 清 0,然后与 1010 0000相或。程序如下: /*设 a 为待处理的数据,转换成二进制为 00001000, b用来保存将 a的高

2、4位清 0后的结果 */ main() unsigned char a,b,c; a=8; b=a c=b|0 xa0; /*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=n 0 xff00; printf( n

3、 after reset,n=%x ,n); 运行结果: before reset,n=00000000 10000001 after reset,n=11111111 10000001 结论:任何二进制位与 0异或,保持不变;与 1异或,对应位 翻转。 4)左移、右移运算实现将一个数的各个二进制位向左、向 右移若干位。 左移:将一个数的各个二进制位左移若干位,高位左移 后舍弃,低位补 0 。 若定义 : int a=8; 即 a= 0000 1000 , 则语句 a=a2 ; 将 a 的各二进制位右移 2 位,空出的 高位补 0。结果为 : 0000 0010 12.2 位段 1. 位段的概

4、念 以 位 为单位定义其长度的 结构体成员 。 2位段的定义 例 12.6若某个控制字长 32位,分 5段,每段的长度分别为: 2 , 6 , 4 , 4 , 16位 ;每段存放一个信息,且第 4段空 出不用。可用如下结构体类型描述: struct con_word unsigned a: 2; /*位段 a,长度为 2*/ unsigned b: 6 ; /*a,b,c为有名位段 */ unsigned c: 4; unsigned : 4; /*该位段为无名位段,表示这 4位空间 空出不使用 */ int i ; data; 变量 data 的存储结构如图 : a b c i 成员名 2

5、6 4 4 16 长度 3位段的引用 位段是结构体类型的某个成员,因此,位段的引用同结构体成 员的引用方法相同。 如: data.a=0 x01; /*给位段 a赋值, */ data.b=0 x0a; /*给位段 b赋值 */ data.i=12; /*给位段 i赋值 */ printf(“%02x, %02x, %4d”, data.a , data.b ,data.i ); 输出: 01, 0a, 12 特别提示:使用位段时,要注意该位段的能表示的数据的范围。 4位段的应用 编程模拟一个温度测控系统:从键盘输入模拟温 度的采样值( 0255),该采样值与 0.2相乘, 得出实际温度值,根

6、据该温度值,控制温度指 示灯的亮与灭(从 0度开始,温度每增加 10度 则多点亮一个指示灯);将该温度值与设定温 度比较,当温度小于 10度和高于 40度时分别开 启升温设备和降温设备,同时报警。反复以上 过程,直至输入的测温值为 300为止。 分析:系统中需要控制的设备有:五个温度指示灯,升温设备, 降温设备,报警设备。因此可用如下的结构体变量 word表 示该系统的控制字,其成员构成如下: ( 1)无符号整型 tem1 用来存放输入的温度采样值( 0255), 若每个刻度代表 0.2度,则可以测量的温度范围为 051度。 浮点类型的成员 tem2用来存放 tem1成员转换成的温度值。 (

7、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; floa

8、t 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=(0 xffff(int)word.tem2/10); /*生成升温、降温设备及报警设备的控制位 */ if(word.tem210) word

9、.alm=ON; word.sw1=ON; word.sw2=OFF; else if(word.tem2tem1); 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=0 x10;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);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!