C语言程序设计课件位运算.ppt

上传人:本田雅阁 文档编号:2143081 上传时间:2019-02-21 格式:PPT 页数:34 大小:176.51KB
返回 下载 相关 举报
C语言程序设计课件位运算.ppt_第1页
第1页 / 共34页
C语言程序设计课件位运算.ppt_第2页
第2页 / 共34页
C语言程序设计课件位运算.ppt_第3页
第3页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言程序设计课件位运算.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件位运算.ppt(34页珍藏版)》请在三一文库上搜索。

1、2019/2/21,位运算,课程:程序设计语言 教材:谭浩强C程序设计第三版 讲授:陈慧炜,2019/2/21,本章重点,6种基本位运算符的使用及其功能 位运算符的综合使用 位段的理解和应用,2019/2/21,请写出47的二进制形式,请写出-47的二进制数形式,提示: 1、在计算机中,数值一律以补码表示 2、绝对值相同的数,原码除符号位外都相同 3、正数的补码、原码、反码相同 4、负数的补码,是原码的反码加1,注意:最高位是符号位,1表示负数,0表示正数,整数的二进制表示,2019/2/21,整数的二进制表示,求负数-47的补码 原码: 反码: 补码:,2019/2/21,位与字节,高 低

2、一个字节由8个二进制位(bit)构成,一个位的取值为0或1。最右端的那一位是“最低位”,编号为0;最左端的那一位称为“最高位”,是符号位,从最低位到最高位按顺序依次编号。,2019/2/21,位运算符,1、按位与(&) 0&0=0,0&1=0,1&1=1 该位只要有一个0便为0 计算: 00000011 (3) & 00000101 (5),(-3) ? &(-5) ? ?,00000001 (1),2019/2/21,按位与的用途,(1)清零(用0相&) 11011001 & 11110000 11010000 (2)保留指定位(用1相&) 01010100 & 00111011 00010

3、000 (3)用来检测某个位是否置位(用1相&),2019/2/21,例:有一数据b,想测试其第4位是否为1? 分析: 1.位号是从右向左数的 2. 设置一个只有第4位为1的二进制数a:00010000,与b进行与运 算,如果结果为00010000,则第4位为1;反之结果为00000000,则第4位为0。,2019/2/21,2、按位或(|),0|0=0,0|1=1,1|1=1 该位只要有一个1便为1 按位或的用途: (1)置位:用1去跟某些位或,使某些位为1,如: 11011001 | 00001111 11011111 (2)保留原位:用0去跟某些位或,如上例前4位,2019/2/21,3

4、、异或(),00=0,01=1,11=0 异号为1(真),同号为0(假) 异或运算符的用途: (1)任何数与本身异或,则为0 10101111 10101111 00000000 (2)与0异或,则保留原值。 10101111 00000000 10101111,2019/2/21,(3)与-1异或,相当于将各位取反(因为-1的每个位都为1)。 10101111 11111111 (-1) 01010000 (4)特定位翻转。将需要翻转的位与1异或即可。 01111010 00001111 01110101,2019/2/21,(5)交换两个值,不用临时变量。 例:a=3,b=4,将a和b的值

5、互换,可以用以下赋值语句实现: a=ab;b=ba;a=ab; a=011 b=100 a=111 b=100 b=011 a=111 a=100 最后,a=100 (4) b=011 (3) 实现了交换,2019/2/21,2019/2/21,4、取反(),0=1,1=0 举例:使16位整数a最低位为0 分析: a&1111111111111110 保留前15位,将最低位清零; 1111111111111110这个数值为多少,较难运算; 1111111111111110 =0000000000000001 0000000000000001的值较为简单,就是1; 所以可以用:a=a&1的表达式

6、达到要求。,2019/2/21,5、左移运算符(),左移n位,右补n个0。 左移n位相当于乘以2n,左移位运算速度比乘法快。 但是,左移位可能溢出,实际结果不会超出指定的整数类型的值域。 unsigned char x = 37 3 ; 00100101 (37) 3 00101000 (40),2019/2/21,6、右移运算符(),右移n位相当于除以2 n,右移位运算速度比除法快。 00001111 2 00000011 注意: 无符号数:右移时左边补0; 有符号数:非负整数右移位时左边补0; 负整数逻辑右移:左边补0; 算术右移:左边补1,2019/2/21,检查一下你所用的计算机系统的

7、C编译系统执行的是逻辑右移还是算术右移: 程序代码: #include void main( ) int a=0,b; b=a1; if(b=a)printf(“算术右移!n”); else printf(“逻辑右移!n”); 若b仍为0,则表明采用的是算术右移,反之为逻辑右移。,2019/2/21,位运算符功能总结,清位(置0):跟0(若非说明,指指定位的值)相& 置位(置1):跟1相| 检测某位是否为1:跟1相& 保留原位:跟1相&,或者跟0相| 翻转某位:跟1相,2019/2/21,位运算综合运用举例,例12.1:取一个整数a从右端开始的47位。,在中间取位比较麻烦,最好将该4位移到最低

8、位,方便操作 a4即:,找一个数与(a4)进行运算,需要保留第四位,而使其余位清零,2019/2/21,设置一个最低四位均为1而其余位为0的数与之进行按位与运算,能够保留最低四位 0: 0000.00000 0: 111111111 04)跟(04)进行与运算,便可保留47位,2019/2/21,例12.2:右循环移位,假设用无符号短整型存放数据: a (16-n)位 n位 b n位 (16-n)位,2019/2/21,例12.2:右循环移位,假设用无符号短整型存放数据: a (16-n)位 n位 c,先取右端n位,放到最高位上: c=a(16-n);,2019/2/21,例12.2:右循环移

9、位,假设用无符号短整型存放数据: a (16-n)位 n位 c d,然后取左端(16-n)位,放到低位: d=an,先取右端n位,放到最高位上: c=a(16-n);,2019/2/21,例12.2:右循环移位,假设用无符号短整型存放数据: a (16-n)位 n位 c d b n位 (16-n)位,然后取左端(16-n)位,放到低位: d=an,先取右端n位,放到最高位上: c=a(16-n);,b=c|d,2019/2/21,对于无符号整数,总长度N(8 16 32),则可以归纳为: 循环右移n: (an) |(a(N-n),2019/2/21,用二进制位存储信息: 将动词“看见”的这六种

10、语法属性存入一个字节,则表示如下: 这个字节的值就是2163250。,2019/2/21,位 段,位段(bit field),就是结构(struct)中的一种字段(成员),这种成员是以二进制位作为长度单位的。动词属性可定义为如下一个结构: struct VerbAttr unsigned short Bu_ : 1 ; unsigned short Mei_ : 1 ; unsigned short Hen_ : 1 ; unsigned short _Zhe : 1 ; unsigned short _Le : 1 ; unsigned short _Guo : 1 ; v;,2019/2/

11、21,结构中可以同时定义位段和其他字段。例如,重新定义动词属性结构如下: struct VerbAttr unsigned short Bu_ : 1 ; unsigned short Mei_ : 1 ; unsigned short Hen_ : 1 ; unsigned short _Zhe : 1 ; unsigned short _Le : 1 ; unsigned short _Guo : 1 ; char verb 9 ; v; 该结构的理论长度为1*2+1*9=11个字节,但为了对齐,垫补了一个字节,这时v的长度是12个字节。,2019/2/21,对位段中的数据引用的方法同样可

12、以用成员运算符“.”和指向成员运算符“-”,如 v.Bu_ = 1 ; p-Hen_ = 0; 对位段进行赋值时需要注意其允许的最大值范围,如对结构 struct unsigned short a:2; unsigned short b:3; unsigned short c:4; int i; data; 写赋值语句 data.a=8 后,位段a 的值为多少?,2019/2/21,关于位段的说明,1、位段成员的类型必须指定为unsigned 或int 类型; 2、可定义长度为0的位段,使某一位段从另一个字开始存放,如下: struct unsigned short a: 1; unsigne

13、d short b: 2; unsigned short : 0; unsigned short c :3; data; data的长度是 几个字节?,2019/2/21,关于位段的说明,3、可定义无名位段,表明该几位空间不用: struct unsigned short a : 1; unsigned short : 1; / 无名位段,这两位空间不用 unsigned short b : 3; unsigned short c : 3; data;,2019/2/21,关于位段的说明,4、一个位段不能跨单元存储。如果第一个单元空间不能容纳下一个位段,则放弃该空间,而从下一个单元起存放该位段

14、。 5、因为最小的存储单位是字节,所以不允许取位段的地址。 6、位段也只能在结构中定义,二进制位数组、返回二进制位的函数、二进制位的指针都是不允许的 7、位段可以用整型格式符输出。例如: printf(“%d,%d,%d”,data.a,data.b,data.c); 8、位段可以在数值表达式中引用,它会被系统自动地转换成整型数。,2019/2/21,总结:,如果特别看重程序的可移植性,还是应该尽量用位运算符来处理二进制位; 如果强调使用方便和源程序的可读性,位段也是一种不错的选择。,2019/2/21,思考与练习,105|78=? 105|78=? C语言标准输出函数只能将一个整数以10、8、16进制输出,没有2进制输出格式。要求编写程序,使键盘输入的正整数按二进制位输出。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1