收藏 分享(赏)

C第2版(第11章_位运算).ppt

上传人:fmgc7290 文档编号:6221858 上传时间:2019-04-02 格式:PPT 页数:20 大小:1.07MB
下载 相关 举报
C第2版(第11章_位运算).ppt_第1页
第1页 / 共20页
C第2版(第11章_位运算).ppt_第2页
第2页 / 共20页
C第2版(第11章_位运算).ppt_第3页
第3页 / 共20页
C第2版(第11章_位运算).ppt_第4页
第4页 / 共20页
C第2版(第11章_位运算).ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、C语言程序设计教程 (第2版),第11章 位运算,本章主要内容,1.按位取反运算 2.按位左移运算 3.按位左移运算 4.按位与运算 5.按位或运算 6.按位异或运算 7.复合位运算,第11章 位运算,11.1 位运算符,C 既具有高级语言的特点,又具有低级语言的功能,位运算能力就是其特色之一。所谓位运算就是指进行二进制位的运算。,C提供的位运算符有:运算符 含义& 按位与 按位或 按位异或 取反 右移,说明: 位运算符中除“”外,其余均为二目运算符,即要求两侧各有一个运算量。, 运算量只能是整型或字符型的数据,不能为实型数据。,11.2 “按位与” 运算符 &,参加运算的两个运算量之对应位都

2、为1,则该位的结果为1,否则为0。即:0&0=0 0&1=0 1&0=0 1&1=1,例: 3&5=13的补码: 000000115的补码: 00000101,& 00000001,& 运算符的用途:, 清零如果想将一个单元清零(全部二进位为),则只要找一个数的补码的对应位0与被清零数的对应位1刚好对应,然后使两者进行 & 运算。,如: 00101011& 10010100,00000000, 取一个数中的某些指定位 如: a: 0010110010101100b: 0000000011111111 (377)8,& 0000000010101100 得到 a 的低 8 位, 保留一个数的某一

3、位 如: 01010100 (84)10& 00111011 (59)10,00010000 (16)10,11.3 “按位或”运算符 ,参加运算的两个运算量之对应位只要有一个为1,则该位的结果为1。即:0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 1,如: 00110000 (060)8 00001111 (017)8,00111111 (077)8,即一个数与017进行按位或运算,就可将该数的低4位全置为1;与0377进行按位或运算,就可将该数的低8位全置为1。,11.4 “异或”运算符 ,参加运算的两个运算量的对应位相同,则该位的结果为0。否则为1。即:0 0 = 0 0

4、1 = 1 1 0 = 1 1 1 = 0,如: 00111001 (57)10 、(071)8 00101010 (42)10 、(052)8,00010011 (19)10 、(023)8, 运算符的用途:,使指定的位翻转 如: 01111010 00001111 对应原数的低4位均置为1,01110101 原数的低4位被翻转,若 a=3, b=4。 则a=ab; b=ba;a=ab; 结果是什么?,交换两个值,不用临时变量,例如:,。 想将和的值互换,可以用以下赋值语句实现: ab; ba; ab;, ()(ab的结果,a已变成) ()(ba的结果,b已变成) ()(ab的结果,a已变成

5、),11.5 “取反” 运算符 , 运算是对一个二进制数按位取反,即将0变为1,1变为0。,8位全1用377; 16位全1用177777; 32位全1用37777777777。,11.6 “左移”运算符 , 用来将一个数的各二进制位全部左移若干位,并在右边补若干个0。高位左移后溢出,舍弃不起作用。如:, 运算的最大用途是做乘法运算。将乘以 2n 的幂运算处理为左移 n 位。,11.7 “右移”运算符 ,用来将一个数的各二进制位全部右移若干位,移到右边的低位被舍弃,对无符号数,高位补0。,如:a 为00001111,则 a2为00000011 11,右移一位相当于除以2 ,右移 n 位相当于除以

6、2 n。,(此 2 位被舍弃),注意:在右移时,需要注意符号位问题。若为无符号数,右移时左边高位移入0。若为有符号数,如果原来符号位为0 (正数),则左边移入0 ;如果原来符号位为1 ,左边移入0的称为“逻辑右移” ,移入1的称为“算术右移”。大多数C语言均采用算术移位。,如: a:1001011111101101 (113755)8a1:0100101111110110 逻辑右移, 得045766a1:1100101111110110 算术右移, 得145766,11.8 程序范例,例11.1 取一个整数 a 从右端开始的 4 7 位。,步骤:, 先使 a 右移 4 位。即:a(7 4 +

7、1 ) a4, 设置一个低4位全为1,其余全为0 的数。即:( 0 4 ), 将两者进行 & 运算,未右移时的情况 右移4位后的情况,#include main( ) unsigned a, b, c, d ;scanf(“%o“, ,运行情况: 331 331 15,例11.2 循环移位。将 a 右循环移 4 位。, 将a的右端 n 位放到b的高端n位中。b = a ( 16 n ), 将a右移n位,其左端高位补n个0。c = a n ;, 将c与b进行按位或运算。c = c b,main( ) unsigned a,b,c; int n;scanf(“a=%o,n=%d”, ,运行情况:

8、a=157653, n=3 157653 (1101111110101011)2 75765 (0111101111110101)2,11.9 位段,有时存储一个信息不必用一个或多个字节,可以在一个字节中存放几个信息。例如, “真”或“假”用1或 0 表示,只需要 1 位就够了。,一、 在一个字节中存放几个数据,图中:a、b、c、d分别占2位、6位、4位、4位。假定c 原来的值为0,现要变为12,则:, 将数 12 左移 4 位,使 1100 成为右边起第 47 位。, 将 data 与 124 按位或即可(设 data 中第 47 位原来为0 )。,若 c 的原值不为0 ,则应先使 c 为0

9、。方法如下:,data = data & 0177417,0177417 称为“屏蔽字”,当然也可以用:data=data / n为赋给c的值 /,二、 位段,位段是以位为单位定义长度的结构体类型中的成员。,struct packed_data unsigned a: 2;unsigned b: 6;unsigned c: 4;unsigned d: 4;int i; data;,结构体中 a、b、c、d 共占 2 个字节,i 占2个字节。,几点说明:, 位段也是一种结构体分量,其引用方法与结构体相同。如:data .a = 2;data .b = 3;, 长度为 的位段可以使其后的位段从下一

10、个存储单元开始存放。如:unsigned a: 1;unsigned b: 2; / 在一个存储单元 /unsigned : 0;unsigned c: 3; / 另一个存储单元 /,必须注意位段分量允许的最大取值范围。,允许,不允许, 一个位段不得跨 2 个存储单元。如:,unsigned a : 6; unsigned a : 6; unsigned a : 5;,unsigned a : 6; unsigned a : 6; unsigned : 0; unsigned a : 5;, 可以定义无名位段。如:unsigned a : 1;unsigned : 2;unsigned b :

11、 3;, 一个位段的长度不得大于一个存储单元的长度,也不能定义位段数组。, 位段可以用整型格式符输出。如:printf(“%d, %d, %d”, data.a, data.b, data.c); 也可以用%u, %o, %x 等格式符输出。, 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。如:data.a + data.b 是合法的。,单操作数参与的位运算符 取反 右移 2. 多操作数参与的位运算符& 按位与 按位或 按位异或3. 位运算的应用,本章重点,习 题,一、单选题 二、判断题 三、填空题 四、编程题 【题11.31】 【题11.32】 【题11.34】 【题11.37】 【题11.38】 【题11.39】,全部,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初级教育 > 小学教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报