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

PPT
  • 阅读 37 次
  • 下载 0 次
  • 页数 34 页
  • 大小 176.582 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言程序设计课件位运算
可在后台配置第一页与第二页中间广告代码
C语言程序设计课件位运算
可在后台配置第二页与第三页中间广告代码
C语言程序设计课件位运算
可在后台配置第三页与第四页中间广告代码
C语言程序设计课件位运算
C语言程序设计课件位运算
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 34
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言程序设计课件位运算.ppt,共(34)页,176.582 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44534.html

以下为本文档部分文字说明:

2022/11/24位运算课程:程序设计语言教材:谭浩强《C程序设计》第三版讲授:陈慧炜2022/11/24本章重点6种基本位运算符的使用及其功能位运算符的综合使用位段的理解和应用2022/11/24请写出47的二进制形式请写出-47的二进制数形式提示:1、在计算机中,数值一

律以补码表示2、绝对值相同的数,原码除符号位外都相同3、正数的补码、原码、反码相同4、负数的补码,是原码的反码加1注意:最高位是符号位,1表示负数,0表示正数整数的二进制表示2022/11/24整数的二进制表示求负数-47的补码原码:反码:补码:2022

/11/24位与字节76543210高低一个字节由8个二进制位(bit)构成,一个位的取值为0或1。最右端的那一位是“最低位”,编号为0;最左端的那一位称为“最高位”,是符号位,从最低位到最高位按顺序依次编号。2022/

11/24位运算符1、按位与(&)0&0=0,0&1=0,1&1=1该位只要有一个0便为0计算:00000011(3)&00000101(5)(-3)?&(-5)??00000001(1)2022/11/24按位与的用途(1)清零(用0相&)1

1011001&1111000011010000(2)保留指定位(用1相&)01010100&0011101100010000(3)用来检测某个位是否置位(用1相&)2022/11/24例:有一数据b,想测试其第4位是否为1

?分析:1.位号是从右向左数的2.设置一个只有第4位为1的二进制数a:00010000,与b进行与运算,如果结果为00010000,则第4位为1;反之结果为00000000,则第4位为0。2022/11/242、按位或(|)0|0=0,0|1=1,1|1=1该位只要有一个1便为1按

位或的用途:(1)置位:用1去跟某些位或,使某些位为1,如:11011001|0000111111011111(2)保留原位:用0去跟某些位或,如上例前4位2022/11/243、异或(^)0^0=0,0^1=1,1^1=0异号为1(真),

同号为0(假)异或运算符的用途:(1)任何数与本身异或,则为010101111^1010111100000000(2)与0异或,则保留原值。10101111^00000000101011112022/11/24(3)与-1异或,相当于将各位取反(因为-1的每个位都为1)。10101111^111

11111(-1)01010000(4)特定位翻转。将需要翻转的位与1异或即可。01111010^00001111011101012022/11/24(5)交换两个值,不用临时变量。例:a=3,b=4,将a和b的值互换,可以用以下赋值语句实现:

a=a^b;b=b^a;a=a^b;a=011^b=100a=111^b=100b=011^a=111a=100最后,a=100(4)b=011(3)实现了交换2022/11/24|&^000110110001011011102022/11/244、取反(~)

~0=1,~1=0举例:使16位整数a最低位为0分析:a&1111111111111110保留前15位,将最低位清零;1111111111111110这个数值为多少,较难运算;1111111111111110=~0000000000000001000000000000000

1的值较为简单,就是1;所以可以用:a=a&~1的表达式达到要求。2022/11/245、左移运算符(<<)左移n位,右补n个0。左移n位相当于乘以2^n,左移位运算速度比乘法快。但是,左移位可能溢出,实际结果不会超出指定的整数类型的值域。unsignedcharx=37<<

3;00100101(37)<<300101000(40)2022/11/246、右移运算符(>>)右移n位相当于除以2^n,右移位运算速度比除法快。00001111>>200000011注意:无符号数:右移时左边

补0;有符号数:非负整数——右移位时左边补0;负整数——逻辑右移:左边补0;算术右移:左边补12022/11/24检查一下你所用的计算机系统的C编译系统执行的是逻辑右移还是算术右移:程序代码:#include<stdio.h>voidmain()

{inta=~0,b;b=a>>1;if(b==a)printf(“算术右移!\n”);elseprintf(“逻辑右移!\n”);}若b仍为~0,则表明采用的是算术右移,反之为逻辑右移。2022/11/24位运算符功能总结清位(置0):跟0(若非说明,指指定位的值)相&置位(置1):跟1相

|检测某位是否为1:跟1相&保留原位:跟1相&,或者跟0相|翻转某位:跟1相^2022/11/24位运算综合运用举例例12.1:取一个整数a从右端开始的4~7位。31876543210313043210在中间取位

比较麻烦,最好将该4位移到最低位,方便操作a>>4即:找一个数与(a>>4)进行运算,需要保留第四位,而使其余位清零2022/11/24设置一个最低四位均为1而其余位为0的数与之进行按位与运算,能够保留最低四位0:0

000….00000~0:1111…..11111~0<<4:1111…..10000为什么不直接右移?~(~0<<4):0000…...01111将(a>>4)跟(~(~0<<4))进行与运算,便可保留4~7位2022/1

1/24例12.2:右循环移位假设用无符号短整型存放数据:a(16-n)位n位bn位(16-n)位2022/11/24例12.2:右循环移位假设用无符号短整型存放数据:a(16-n)位n位c先取右端n位,放到最高位上:

c=a<<(16-n);2022/11/24例12.2:右循环移位假设用无符号短整型存放数据:a(16-n)位n位cd然后取左端(16-n)位,放到低位:d=a>>n先取右端n位,放到最高位上:c=a<<(16-n);2022/11/24例12.2:右循环

移位假设用无符号短整型存放数据:a(16-n)位n位cdbn位(16-n)位然后取左端(16-n)位,放到低位:d=a>>n先取右端n位,放到最高位上:c=a<<(16-n);b=c|d2022/11/24对于无符号整数,总长度N(816

32),则可以归纳为:循环右移n:(a>>n)|(a<<(N-n))循环左移n:(a<<n)|(a>>(N-n))2022/11/24用二进制位存储信息:将动词“看见”的这六种语法属性存入一个字节,则表示如下:这个字节

的值就是2+16+32=50。未用未用__过__了__着很__没__不__00xxxxxx未用未用__过__了__着很__没__不__001100102022/11/24位段位段(bitfield),就是结构(struct)中的一种字段(成员),这种成员是以二进制位作为长度单位的。动词

属性可定义为如下一个结构:structVerbAttr{unsignedshortBu_:1;unsignedshortMei_:1;unsignedshortHen_:1;unsignedshort_Zhe:1;un

signedshort_Le:1;unsignedshort_Guo:1;}v;2022/11/24结构中可以同时定义位段和其他字段。例如,重新定义动词属性结构如下:structVerbAttr{unsignedshortBu_:1;unsignedshortMei_:1;uns

ignedshortHen_:1;unsignedshort_Zhe:1;unsignedshort_Le:1;unsignedshort_Guo:1;charverb[9];}v;该结构的理论长度为1*2+1*9=11个字节,但为了对齐,垫补了一个字节,这时v的长度是12个字节。2022/

11/24对位段中的数据引用的方法同样可以用成员运算符“.”和指向成员运算符“->”,如v.Bu_=1;p->Hen_=0;对位段进行赋值时需要注意其允许的最大值范围,如对结构struct{unsignedshorta:2;unsignedshortb:3;unsign

edshortc:4;inti;}data;写赋值语句data.a=8后,位段a的值为多少?2022/11/24关于位段的说明1、位段成员的类型必须指定为unsigned或int类型;2、可定义长度为0的位段,使某一位段从另一

个字开始存放,如下:struct{unsignedshorta:1;unsignedshortb:2;unsignedshort:0;unsignedshortc:3;}data;data的长度是几个字节?2022/11/24关于位段的说明3、可定义无名位段,表明该几位空间不用:struct{un

signedshorta:1;unsignedshort:1;//无名位段,这两位空间不用unsignedshortb:3;unsignedshortc:3;}data;2022/11/24关于位段的说明4、一个位段不能跨单元存储。如果第一个单元空间不能容纳

下一个位段,则放弃该空间,而从下一个单元起存放该位段。5、因为最小的存储单位是字节,所以不允许取位段的地址。6、位段也只能在结构中定义,二进制位数组、返回二进制位的函数、二进制位的指针都是不允许的7、位段可以用整型格式符

输出。例如:printf(“%d,%d,%d”,data.a,data.b,data.c);8、位段可以在数值表达式中引用,它会被系统自动地转换成整型数。2022/11/24总结:如果特别看重程序的可移植性,还是应该尽量用位运算符来处理二进制位;如果强调使用方便和源程序的可读性,位

段也是一种不错的选择。2022/11/24思考与练习105||78=?105|78=?C语言标准输出函数只能将一个整数以10、8、16进制输出,没有2进制输出格式。要求编写程序,使键盘输入的正整数按二进制位输出。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?