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

上传人:sccc 文档编号:5378226 上传时间:2023-07-01 格式:PPT 页数:34 大小:176.51KB
返回 下载 相关 举报
C语言程序设计课件位运算.ppt_第1页
第1页 / 共34页
C语言程序设计课件位运算.ppt_第2页
第2页 / 共34页
C语言程序设计课件位运算.ppt_第3页
第3页 / 共34页
C语言程序设计课件位运算.ppt_第4页
第4页 / 共34页
C语言程序设计课件位运算.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

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

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

2、成,一个位的取值为0或1。最右端的那一位是“最低位”,编号为0;最左端的那一位称为“最高位”,是符号位,从最低位到最高位按顺序依次编号。,2023/7/1,位运算符,1、按位与(&)0&0=0,0&1=0,1&1=1该位只要有一个0便为0计算:00000011(3)&00000101(5),(-3)?&(-5)?,00000001(1),2023/7/1,按位与的用途,(1)清零(用0相&)11011001&11110000 11010000(2)保留指定位(用1相&)01010100&00111011 00010000(3)用来检测某个位是否置位(用1相&),2023/7/1,例:有一数据b

3、,想测试其第4位是否为1?分析:1.位号是从右向左数的 2.设置一个只有第4位为1的二进制数a:00010000,与b进行与运 算,如果结果为00010000,则第4位为1;反之结果为00000000,则第4位为0。,2023/7/1,2、按位或(|),0|0=0,0|1=1,1|1=1该位只要有一个1便为1按位或的用途:(1)置位:用1去跟某些位或,使某些位为1,如:11011001|00001111 11011111(2)保留原位:用0去跟某些位或,如上例前4位,2023/7/1,3、异或(),00=0,01=1,11=0异号为1(真),同号为0(假)异或运算符的用途:(1)任何数与本身异

4、或,则为0 10101111 10101111 00000000(2)与0异或,则保留原值。10101111 00000000 10101111,2023/7/1,(3)与-1异或,相当于将各位取反(因为-1的每个位都为1)。10101111 11111111(-1)01010000(4)特定位翻转。将需要翻转的位与1异或即可。01111010 00001111 01110101,2023/7/1,(5)交换两个值,不用临时变量。例:a=3,b=4,将a和b的值互换,可以用以下赋值语句实现:a=ab;b=ba;a=ab;a=011 b=100 a=111 b=100 b=011 a=111 a

5、=100最后,a=100(4)b=011(3)实现了交换,2023/7/1,2023/7/1,4、取反(),0=1,1=0 举例:使16位整数a最低位为0 分析:a&1111111111111110 保留前15位,将最低位清零;1111111111111110这个数值为多少,较难运算;1111111111111110=0000000000000001 0000000000000001的值较为简单,就是1;所以可以用:a=a&1的表达式达到要求。,2023/7/1,5、左移运算符(),左移n位,右补n个0。左移n位相当于乘以2n,左移位运算速度比乘法快。但是,左移位可能溢出,实际结果不会超出指定

6、的整数类型的值域。unsigned char x=37 3;00100101(37)300101000(40),2023/7/1,6、右移运算符(),右移n位相当于除以2 n,右移位运算速度比除法快。000011112 00000011注意:无符号数:右移时左边补0;有符号数:非负整数右移位时左边补0;负整数逻辑右移:左边补0;算术右移:左边补1,2023/7/1,检查一下你所用的计算机系统的C编译系统执行的是逻辑右移还是算术右移:程序代码:#includevoid main()int a=0,b;b=a1;if(b=a)printf(“算术右移!n”);else printf(“逻辑右移!n

7、”);若b仍为0,则表明采用的是算术右移,反之为逻辑右移。,2023/7/1,位运算符功能总结,清位(置0):跟0(若非说明,指指定位的值)相&置位(置1):跟1相|检测某位是否为1:跟1相&保留原位:跟1相&,或者跟0相|翻转某位:跟1相,2023/7/1,位运算综合运用举例,例12.1:取一个整数a从右端开始的47位。,在中间取位比较麻烦,最好将该4位移到最低位,方便操作a4即:,找一个数与(a4)进行运算,需要保留第四位,而使其余位清零,2023/7/1,设置一个最低四位均为1而其余位为0的数与之进行按位与运算,能够保留最低四位 0:0000.00000 0:1111.11111 04)

8、跟(04)进行与运算,便可保留47位,2023/7/1,例12.2:右循环移位,假设用无符号短整型存放数据:a(16-n)位 n位 b n位(16-n)位,2023/7/1,例12.2:右循环移位,假设用无符号短整型存放数据:a(16-n)位 n位c,先取右端n位,放到最高位上:c=a(16-n);,2023/7/1,例12.2:右循环移位,假设用无符号短整型存放数据:a(16-n)位 n位c d,然后取左端(16-n)位,放到低位:d=an,先取右端n位,放到最高位上:c=a(16-n);,2023/7/1,例12.2:右循环移位,假设用无符号短整型存放数据:a(16-n)位 n位c db

9、n位(16-n)位,然后取左端(16-n)位,放到低位:d=an,先取右端n位,放到最高位上:c=a(16-n);,b=c|d,2023/7/1,对于无符号整数,总长度N(8 16 32),则可以归纳为:循环右移n:(an)|(a(N-n),2023/7/1,用二进制位存储信息:将动词“看见”的这六种语法属性存入一个字节,则表示如下:这个字节的值就是2163250。,2023/7/1,位 段,位段(bit field),就是结构(struct)中的一种字段(成员),这种成员是以二进制位作为长度单位的。动词属性可定义为如下一个结构:struct VerbAttrunsigned short Bu

10、_:1;unsigned short Mei_:1;unsigned short Hen_:1;unsigned short _Zhe:1;unsigned short _Le:1;unsigned short _Guo:1;v;,2023/7/1,结构中可以同时定义位段和其他字段。例如,重新定义动词属性结构如下:struct VerbAttrunsigned short Bu_:1;unsigned short Mei_:1;unsigned short Hen_:1;unsigned short _Zhe:1;unsigned short _Le:1;unsigned short _Guo

11、:1;char verb 9;v;该结构的理论长度为1*2+1*9=11个字节,但为了对齐,垫补了一个字节,这时v的长度是12个字节。,2023/7/1,对位段中的数据引用的方法同样可以用成员运算符“.”和指向成员运算符“-”,如 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 的值为多少?,2023/7/1,关于位段的说明,1、位段成员的类型必须指定为unsign

12、ed 或int 类型;2、可定义长度为0的位段,使某一位段从另一个字开始存放,如下:struct unsigned short a:1;unsigned short b:2;unsigned short:0;unsigned short c:3;data;data的长度是 几个字节?,2023/7/1,关于位段的说明,3、可定义无名位段,表明该几位空间不用:struct unsigned short a:1;unsigned short:1;/无名位段,这两位空间不用 unsigned short b:3;unsigned short c:3;data;,2023/7/1,关于位段的说明,4、

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

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号