C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章

上传人:E**** 文档编号:89190625 上传时间:2019-05-21 格式:PPT 页数:26 大小:88KB
返回 下载 相关 举报
C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章_第1页
第1页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章_第2页
第2页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章_第3页
第3页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章_第4页
第4页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章》由会员分享,可在线阅读,更多相关《C语言程序设计实用教程 教学课件 ppt 作者 魏海新 李燕 第11章(26页珍藏版)》请在金锄头文库上搜索。

1、第11章 位运算,教学提示 C语言的运算符除了前面介绍的算术运算符、关系运算符、赋值运算符、逻辑运算符、条件运算符等运算符以外,还有位运算符。本章将介绍位运算、位段结构的定义和使用。 教学目标 掌握位运算及其运算规则,熟悉位运算符的应用,掌握位段结构的定义,了解位段结构的使用。,11.1 概述,C语言既具有高级语言的特点,又具有低级语言的特点。因而具有广泛的用途和很强的生命力。本章介绍的位运算和指针运算一样,适合于编写系统软件的需要。在系统软件中,常需要处理二进制位的问题。C语言提供了位运算的功能,因此与其他高级语言相比,具有很大的优越性。 所谓位运算是指进行二进制位的运算。例如,将一个存储单

2、元中的所有二进制位全置为1,两个数按位相加等。,11.1.1 字节和位,字节(byte)是计算机中存储信息最常用的基本单位。计算机内存储器中,每一个字节都有一个地址,称为内存地址。 一个字节包含8个二进位(bit),其中最右边的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”,每一个二进位的值是0或1。,11.1.2 原码、反码和补码,1、原码 最高位做符号位(0代表正,1代表负),其余各位代表数值本身的绝对值。 例如:,2、反码 一个数如果为正,则它的反码与原码相同; 一个数如果为负,则它的反码的符号位为1,其余各位是对原码取反。,3、补码 原码和补码都不便于计

3、算机内的计算,因为在运算中要单独处理其符号,很不方便。因此,最好能做到将符号位和其他位统一处理,对减法也按加法处理,这就是“补码”。,补码对减法按加法处理的原理是这样的: 对十进制数,如果想从8得到2,可以用减法: 8-6=2 也可以用加法,将8加上6的补数(6的补数为10-6=4),即:8+4=12,再去掉最高位1,即可得到结果2。,关于补码的规定: 正数其原码、反码、补码相同; 负数的补码为在其反码的最低位加1。 例如,求-6的补码, -6的原码: 10000000 00000110 -6的反码: 11111111 11111001 + 1 -6的补码: 11111111 11111010

4、,用补码进行算术运算,减法可以用加法实现。 例如: 7-6可以将+7的补码和-6的补码相加,可得到结果值 的补码值: +7的补码为: 00000000 00000111 -6的补码为: 11111111 11111010 相加得: 1 00000000 00000001 舍去进位,后面16位00000000 00000001就是1的补 码。,11.2 位运算符,C语言提供的位运算符及基含义见下表。,11.2.1 按位与运算符“&”,按位与运算规则:运算符两边都为1,运算结果为1,否则都为0。即: 1&1=1 1&0=0 0&1=0 0&0=0,例11.1 计算3&5的值。 先把3和5用补码表示

5、 ,再进行按位与运算: 3的补码: 00000000 00000011 5的补码: 00000000 00000101 &: 00000000 00000001 (为1的补码) 即3&5的值为十进制数1。,11.2.2 按位或运算符“|”,按位或运算规则:两个相应位中只要有一个为1,按位或结果值为1,只有两个相应位都为0时,结果才为0。即: 1|1=1 1|0=1 0|1=1 0|0=0,例11.3 计算-5|3的值。 -5的补码: 11111111 11111011 3的补码: 00000000 00000011 |: 11111111 11111011,11.2.3 按位异或运算符“”,按

6、位异或运算规则:参加运算的两相相应位相同,运算结果为0,不同则为1。即: 11=1 10=1 01=1 00=0,按位异或的用途有:使特定位翻转,保留原值等。 例11.4 将01111010低4位翻转,其余位不变。 将它与00001111进行 运算即可: 01111010 00001111 01110101,11.2.4 按位取反运算符“”,例如,要将八进制数25按位求反。可先求 出其补码:00000000 00010101 取反得:11111111 11101010,取反运算规则:用来对一个二进制数按位取反,是一个单目运算符。 0=1 1=0.,注:运算符的优先级别比算术运算符、关系运算符、

7、逻辑运算符和其他运算符都高。,11.2.5 左移运算符“”,左移运算用来将一个数的各二进位左移若干位,右侧补0。,例如: 若a=15,其二进制形式为:00001111, 则将其左移两位即a=a2相当于: a=000011112 得:a=00111100,其十进制数为60,即152=60。,高位左移后溢出,舍弃不起作用。左移1位相当于该数乘以2,但注意此结论只是适用于左移时溢出的高位中不包含1的情况。左移运算比乘法运算快得多。,11.2.5 右移运算符“”,右移运算用来将一个数的各二进位右移若干位,移到右端的低位被舍弃,对无符号位,高位补0。,例如:a=15,其二进制形式为:00001111,则

8、将其右移两位即a=a2相当于: 000011112 得: 00000011,说明:右移时注意符号位的问题。对无符号数,右移时左边高位移入0。对于有符号数,若符号位为0,则左边移入0,如符号位为1,则左边移入0还是1,取决于所用的计算机系统。移入0的称为”逻辑右移”,移入1的称为“算术右移”。,11.2.6 位运算举例,例11.5 循环移位。要求将a进行右循环移位,即将a中原来左面的(16-n)位右移n位,原来右端n位移到最左边n位,假设用两个字节存放一个整数。,解决步骤是这样的: 1.将a的右端n位先放到b中的高n位中,可以用下面的语句实现: b=an; 3.将c与b进行按位或运算,即: c=

9、c|b;,#include main() unsigned a,b,c; int n; scanf(“a=%o,n=%d“, ,程序运行情况如下: 输入:a=157653,n=3 输出:a=157653,c=75765,11.3 位段,对内存中信息的存取一般以字节为单位。 在计算机用于过程控制、数据通信等领域时,控制 信息往往只占一个或几个二进制位,也就是说常常在 一个字节中放几个信息。 那么,怎样向一个字节中的一个或几个二进制位进 行赋值或者取得他们的值呢?有两种方法: 1.通过位运算。 2.利用位段。,11.3.1 位段,1、位段的定义 所谓位段是以位为单位的结构体类型中的成员。 C语言允

10、许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的结构体成员称为“位段”(bit field)。,例如,有结构体定义: struct packed_data unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i; data;,其中a、b、c、d四个成员都是以位为单位的结构体成员,即位段。,位段长度也可不占满一个字节: struct packed_data unsigned a:2; unsigned b:3; unsigned c:4; int i; data;,其中a、b、c共占9位,占1个字节,不到2个

11、字节。它的后面为int型,占2个字节。此时,在a、b、c之后的7位空间闲置不用,i从另一字节开头起存放。,2、对位段中数据的引用方法 对位段的使用方法和结构体中其它成员基本相同。如有结构体定义如下: struct packed_data unsigned a:2; unsigned b:6; int i; data; 则对data中的位段赋值: data.a=2; data.b=7; 注意位段的取值范围,关于位段的定义和引用,有几点说明: (1)若某一位段要从另一字节开始存放,可以用以下形式定义: unsigned a: 1; unsigned b: 2; (a,b占一个存储单元) unsig

12、ned : 0; unsigned c: 3; (c从另一单元开始存放) 其中长度为0的位段的作用,是使下一个位段从下一个存储单元开始存放。,(2)一个位段必须存储在同一个存储单元中,不能跨两个单元。如果第一个单元剩余的空间不能容纳下一个位段,则该空间不用,而从下一单元起存放该位段。 (3)可以定义无名位段。如: unsigned a:1; unsigned :2;(无名位段,这两位空间不用) unsigned b:3; unsigned c:4;,(4)位段的长度不能大于存储单元的长度,也不能定义位段数组。 (5)位段可以用%d、%u、%o、%x等格式输出。如: printf(“%d, %u, %x”,data.a,data.b,data.c); (6)位段可以在数值表达式中引用,系统自动将它转化成整形数。如: data.a+5/data.b; 是合法的。,

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

当前位置:首页 > 高等教育 > 大学课件

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