版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、位运算课程:程序设计语言教材:谭浩强C程序设计第三版讲授:陈慧炜10/10/2022位运算课程:程序设计语言10/9/2022本章重点6种基本位运算符的使用及其功能位运算符的综合使用位段的理解和应用10/10/2022本章重点6种基本位运算符的使用及其功能10/9/2022请写出47的二进制形式请写出-47的二进制数形式提示:1、在计算机中,数值一律以补码表示2、绝对值相同的数,原码除符号位外都相同3、正数的补码、原码、反码相同4、负数的补码,是原码的反码加1注意:最高位是符号位,1表示负数,0表示正数整数的二进制表示10/10/2022请写出47的二进制形式请写出-47的二进制数形式提示:注
2、意:整数的二进制表示求负数-47的补码原码:反码:补码:10/10/2022整数的二进制表示求负数-47的补码10/9/2022位与字节76543210 高 低一个字节由8个二进制位(bit)构成,一个位的取值为0或1。最右端的那一位是“最低位”,编号为0;最左端的那一位称为“最高位”,是符号位,从最低位到最高位按顺序依次编号。10/10/2022位与字节76543210 高 位运算符1、按位与(&) 0&0=0,0&1=0,1&1=1该位只要有一个0便为0计算: 00000011 (3) & 00000101 (5) (-3) ?&(-5) ? ? 00000001 (1)10/10/202
3、2位运算符1、按位与(&) (-3) ?0000000按位与的用途 (1)清零(用0相&) 11011001 & 11110000 11010000 (2)保留指定位(用1相&) 01010100 & 00111011 00010000 (3)用来检测某个位是否置位(用1相&)10/10/2022按位与的用途 (1)清零(用0相&)10/9/2022例:有一数据b,想测试其第4位是否为1?分析: 1.位号是从右向左数的 2. 设置一个只有第4位为1的二进制数a:00010000,与b进行与运 算,如果结果为00010000,则第4位为1;反之结果为00000000,则第4位为0。10/10/2
4、022例:有一数据b,想测试其第4位是否为1?10/9/20222、按位或(|) 0|0=0,0|1=1,1|1=1该位只要有一个1便为1按位或的用途: (1)置位:用1去跟某些位或,使某些位为1,如: 11011001 | 00001111 11011111 (2)保留原位:用0去跟某些位或,如上例前4位10/10/20222、按位或(|) 0|0=0,0|1=1,1|1=110/93、异或() 00=0,01=1,11=0异号为1(真),同号为0(假)异或运算符的用途:(1)任何数与本身异或,则为0 10101111 10101111 00000000(2)与0异或,则保留原值。 1010
5、1111 00000000 1010111110/10/20223、异或() 00=0,01=1,11=010/9/(3)与-1异或,相当于将各位取反(因为-1的每个位都为1)。 10101111 11111111 (-1) 01010000(4)特定位翻转。将需要翻转的位与1异或即可。 01111010 00001111 01110101 10/10/2022(3)与-1异或,相当于将各位取反(因为-1的每个位都为1)(5)交换两个值,不用临时变量。 例:a=3,b=4,将a和b的值互换,可以用以下赋值语句实现: a=ab;b=ba;a=ab; a=011 b=100 a=111 b=100
6、 b=011 a=111 a=100最后,a=100 (4) b=011 (3) 实现了交换10/10/2022(5)交换两个值,不用临时变量。10/9/2022 | & 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 010/10/2022 | & 4、取反() 0=1,1=0 举例:使16位整数a最低位为0 分析: a&1111111111111110 保留前15位,将最低位清零; 1111111111111110这个数值为多少,较难运算; 1111111111111110 =0000000000000001 0000000000000001的值较为简单,就是1
7、; 所以可以用:a=a&1的表达式达到要求。 10/10/20224、取反() 0=1,1=0 10/9/20225、左移运算符() 左移n位,右补n个0。左移n位相当于乘以2n,左移位运算速度比乘法快。但是,左移位可能溢出,实际结果不会超出指定的整数类型的值域。 unsigned char x = 37 3 ;00100101(37)300101000(40)10/10/20225、左移运算符() 右移n位相当于除以2 n,右移位运算速度比除法快。 000011112 00000011注意: 无符号数:右移时左边补0; 有符号数:非负整数右移位时左边补0; 负整数逻辑右移:左边补0; 算术右
8、移:左边补1 10/10/20226、右移运算符() 右移n位相当于除以2 n,右移位运检查一下你所用的计算机系统的C编译系统执行的是逻辑右移还是算术右移:程序代码:#includevoid main( )int a=0,b;b=a1; if(b=a)printf(“算术右移!n”); else printf(“逻辑右移!n”);若b仍为0,则表明采用的是算术右移,反之为逻辑右移。10/10/2022检查一下你所用的计算机系统的C编译系统执行的是逻辑右移还是算位运算符功能总结 清位(置0):跟0(若非说明,指指定位的值)相&置位(置1):跟1相|检测某位是否为1:跟1相&保留原位:跟1相&,或
9、者跟0相|翻转某位:跟1相10/10/2022位运算符功能总结 清位(置0):跟0(若非说明,指指定位的值位运算综合运用举例 例12.1:取一个整数a从右端开始的47位。31876543210313043210在中间取位比较麻烦,最好将该4位移到最低位,方便操作a4即: 找一个数与(a4)进行运算,需要保留第四位,而使其余位清零10/10/2022位运算综合运用举例 例12.1:取一个整数a从右端开始的4设置一个最低四位均为1而其余位为0的数与之进行按位与运算,能够保留最低四位 0: 0000.00000 0: 1111.11111 04: 1111.10000 为什么不直接右移?(04)跟(
10、04)进行与运算,便可保留47位10/10/2022设置一个最低四位均为1而其余位为0的数与之进行按位与运算,能例12.2:右循环移位 假设用无符号短整型存放数据:a (16-n)位 n位 b n位 (16-n)位 10/10/2022例12.2:右循环移位 假设用无符号短整型存放数据:10/9例12.2:右循环移位 假设用无符号短整型存放数据:a (16-n)位 n位c 先取右端n位,放到最高位上:c=an先取右端n位,放到最高位上:c=an先取右端n位,放到最高位上:c=an) |(a(N-n)循环左移n: (a(N-n)10/10/2022对于无符号整数,总长度N(8 16 32),则可
11、以归纳为:1用二进制位存储信息:将动词“看见”的这六种语法属性存入一个字节,则表示如下: 这个字节的值就是2163250。 未用未用_过_了_着很_没_不_00 xxxxxx未用未用_过_了_着很_没_不_0011001010/10/2022用二进制位存储信息:未用未用_过_了_着很_没_不位 段 位段(bit field),就是结构(struct)中的一种字段(成员),这种成员是以二进制位作为长度单位的。动词属性可定义为如下一个结构: struct VerbAttrunsigned short Bu_ : 1 ;unsigned short Mei_ : 1 ;unsigned short
12、Hen_ : 1 ;unsigned short _Zhe : 1 ;unsigned short _Le : 1 ;unsigned short _Guo : 1 ; v;10/10/2022位 段 位段(bit field),就是结构(struct)结构中可以同时定义位段和其他字段。例如,重新定义动词属性结构如下:struct VerbAttrunsigned short Bu_ : 1 ;unsigned short Mei_ : 1 ;unsigned short Hen_ : 1 ;unsigned short _Zhe : 1 ;unsigned short _Le : 1 ;un
13、signed short _Guo : 1 ; char verb 9 ; v; 该结构的理论长度为1*2+1*9=11个字节,但为了对齐,垫补了一个字节,这时v的长度是12个字节。 10/10/2022结构中可以同时定义位段和其他字段。例如,重新定义动词属性结构对位段中的数据引用的方法同样可以用成员运算符“.”和指向成员运算符“-”,如 v.Bu_ = 1 ;p-Hen_ = 0; 对位段进行赋值时需要注意其允许的最大值范围,如对结构 struct unsigned short a:2; unsigned short b:3; unsigned short c:4; int i; data;
14、 写赋值语句 data.a=8 后,位段a 的值为多少?10/10/2022对位段中的数据引用的方法同样可以用成员运算符“.”和指向成员关于位段的说明 1、位段成员的类型必须指定为unsigned 或int 类型;2、可定义长度为0的位段,使某一位段从另一个字开始存放,如下:struct unsigned short a: 1; unsigned short b: 2; unsigned short : 0; unsigned short c :3;data; data的长度是 几个字节?10/10/2022关于位段的说明 1、位段成员的类型必须指定为unsigned关于位段的说明3、可定义无
15、名位段,表明该几位空间不用: struct unsigned short a : 1; unsigned short : 1; / 无名位段,这两位空间不用 unsigned short b : 3; unsigned short c : 3;data;10/10/2022关于位段的说明3、可定义无名位段,表明该几位空间不用:10/关于位段的说明4、一个位段不能跨单元存储。如果第一个单元空间不能容纳下一个位段,则放弃该空间,而从下一个单元起存放该位段。5、因为最小的存储单位是字节,所以不允许取位段的地址。6、位段也只能在结构中定义,二进制位数组、返回二进制位的函数、二进制位的指针都是不允许的7、位段可以用整型格式符输出。例如: printf(“%d,%d,%d”,data.a,data.b,data.c);8、位段可以在数值表达式中引用,它会被系统自动地转换成整型数。10/10/2022关于位段的说明4、一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年耳机原材料供应商质量保证合同
- 2024马铃薯种植基地安全生产责任合同3篇
- 2024年股权激励计划书
- 2024年金融科技研发与创新服务合同
- 2024跨国企业广告宣传与推广合同
- 2024年食品企业HACCP体系认证咨询合同版B版
- 2024年航空公司客舱餐饮服务供应合同
- 2024轻质隔墙板行业规范制定与执行监督协议3篇
- 2024年药品销售与售后服务协议3篇
- 2024年适用餐饮行业购销协议范例版B版
- 2024-2029年中国智能健康手表行业市场现状分析及竞争格局与投资发展研究报告
- 生物医学电子学智慧树知到期末考试答案章节答案2024年天津大学
- 2023 版《中国近现代史纲要》 课后习题答案
- DB11T 489-2024 建筑基坑支护技术规程
- 一例火电机组有功功率突变原因分析及预防措施
- 数学寒假计划书
- 第五章 中国特色社会主义理论体系的形成发展(一)
- 低空经济公司设立可行性分析
- 2024新能源风电场集电线路施工方案
- 2023-2024学年江西省吉安市吉州区八年级(上)期末数学试卷(含解析)
- 建筑工程周转材料及保证措施
评论
0/150
提交评论