




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第17章 位运算操作符在本章的学习中,需要掌握以下内容:字节和位的概念;原码与补码的转换;6种位操作符及其组成的位运算赋值操作符的使用;各个位操作符的特殊用途;位域的概念和位域的使用。17.1 位运算位运算是指对数据的二进制位进行处理的运算。位运算与数据在内存中的存储方式息息相关,因此在介绍位运算操作符之前,有必要先介绍一些操作系统中数据存储和处理的相关知识。本节首先介绍字节与位的概念以及两者的关系,再介绍数据在内存中的储存方式。17.1.1 字节与位在前面的介绍中已多次涉及到字节的概念。操作系统中的各种类型的数值都由若干个字节组成,字节也是数据存取和数值计算的基本单元。从内存中读取数据是以字
2、节为最小单位,向内存中写入数据也是以字节为最小单位。将数值输出到文件和从文件获取数值时,最小单位也是字节。17.1.1 字节与位字节在操作系统中可以分为更小的单元“位”。大部分系统中,1个字节由8个位组成,每个位的值为0或1。一个字节的数值由其8个位的值决定,如果一个字节的内容为“01101010”。其对应的值为:这个字节的值为8个位组成的二进制数。但是在操作系统中,数值的存储并不是直接以其二进制值存储的。17.1.2 补码在操作系统中,数值一律用补码来存储。一个数值的二进制值可以称其为原码,存储时会将原码表示为补码。补码的最高位为符号位,数值的补码表示可以分为以下两种情况。17.1.2 补码
3、1非负数的补码非负数的补码与原码相同。例如,11的原码为00001011,其补码也为00001011。注意:为了简化书写,讨论位运算时,大部分的数值只用一个字节表示。 2负数的补码负数的补码的符号位为1,其余位为将该数绝对值的原码按位取反后再加1的结果。例如,-15的补码:因为是负数,则符号位为“1”,整个为10001111;其余7位为-15的绝对值的原码按位取反,即0001111取反后为1110000,再加1为1110001;加上符号位,最后15的补码是11110001。已知一个数的补码,其求原码的过程与已知原码求补码的过程完全一样:如果补码的符号位为“0”,表示是一个正数,所以补码就是该数
4、的原码。如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反加1。使用补码计算时,可以将符号位和其他位统一处理。17.1.2 补码例如,7 + 15,其补码相加如左图所示。(-7) + (-15),其补码相加如右图所示。17.1.2 补码注意:两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。减法也可按加法来处理,7 15的计算过程如下图所示。17.1.2 补码17.2 位运算操作符C语言共提供了6个位运算操作符,包括取反操作符()、位或操作符(|)、位与操作符(&)、异或操作符()和位移操作符(和)右移操作符的作用是将一个数的各二进制值全部
5、右移若干位。其使用形式如下:数值1 数值2;该表达式将数值1的二进制值右移(数值2)位,移到右端的低位被舍弃,而高位补入的数值由符号位决定。如果是无符号数,则高位补入的数为0。例如:int a = 39;a = a 2; 则变量a将右移两位,即00100111右移两位,得到00001001,右端的两个1被舍弃。如下图所示。17.2.5 右移操作符()17.2.5 右移操作符()如果是有符号数,则不同的系统有不同的处理方式。有的系统补入0,有的补入符号位。补入0的为“逻辑右移”,补入原符号位的为“算术右移”。例如,将-15右移两位,算术右移后结果为11111100,逻辑右移结果为00111100
6、,如下图所示。17.2.6 左移操作符()左移操作符将一个数的各个二进制位值全部左移若干位。使用形式如下:数值1 数值2;该表达式将数值1的二进制值左移(数值2)位,移到左端的高位被舍弃,而低位补入的数值为0。例如:int a = 39;int b = a 1;int c = a 2;int d = a 3; a的值为39,即00100111;b的值为39左移1位的结果,左端舍去1个0,右端补入1个0,得到01001110;c值为39左移2位的结果,左端舍去2个0,右端补入2个0,得到10011100;d值为39左移3位的结果,左端舍去2个0和1个1,右端补入3个0,得到00111000,如下
7、图所示。17.2.6 左移操作符()17.2.6 左移操作符(= 3;等效于a = a 3;又例如:a &= b;等效于a = a & b范例17-7第20行也可以改写为:flag = 1;17.3 位运算操作符使用举例位运算操作符在C语言中的使用十分灵活,通过一些巧妙地算法可以高效地实现一些实用的功能。为了更熟悉位运算操作符的使用,本节将继续讨论两个例子。17.3.1 循环移位循环移位是一种重要的移位方式。循环移位区别于一般移位的是移位时没有数位的丢失。循环左移时,用从左边移出的位填充字的右端;而循环右移时,用从右边移出的位填充字的左侧。本题暂只讨论循环右移。例如,要将39循环右移2位,即0
8、0100111右移两位,移到右端的两个1不会丢失,将补到左端的2个空缺位置上,如下图所示。17.3.1 循环移位例如要对a(无符号数)循环右移3位,可以采用以下方案:(1)首先把将要移出右端的3个位左移8-3位(假定a占8个位)后保存在b中,此时b形式如下图第2行所示,其中yyy是a的后3位。(2)将a右移3位,右端3位被舍弃,又由于a为无符号数,左端添加3个0,如下图第3行所示。(3)最后将a与b位或,由于0和任意值位或补改变该值,因此得到yyyxxxxx,如下图第4行所示。17.3.2 使用子网掩码子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在外部网上。如果一个IP地址与子网掩码相与的结果与一个子网地址相同,那么这个IP地址便属于该子网。有两个子网地址59.64.200.0和59.64.201.0,两个IP地址59.64.200.18和59.64.201.20,子网
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度商业用途二手房买卖合同范本模板
- 2025版土地转包及综合管理服务合同
- 2025年防水材料节能减排与采购合同范本
- 2025年度砂石行业供应链管理采购合同范本解读
- 2025版房产代理销售合同范本:精装修公寓销售
- 2025年度跨境电商第三方仓储物流抵押担保服务合同
- 2025版汽车限购指标租赁中介服务合同标准范本
- 自考专业(人力资源管理)考试彩蛋押题含完整答案详解(名校卷)
- 2025年花艺师职业资格考试花卉植物生理生化试题卷
- 自考专业(国贸)考前冲刺练习试题含完整答案详解【有一套】
- 2022-2023部编新人教版小学6六年级数学上册(全册)教案
- “三重一大”决策 标准化流程图 20131017
- Cpk 计算标准模板
- 信息科技课程标准新课标学习心得分享
- 小学生元宵中秋猜谜语竞赛题目
- 环保与物业公司合作协议
- FZ/T 01057.2-2007纺织纤维鉴别试验方法 第2部分:燃烧法
- 面条制品-课件
- 四上科学第一单元《多样的动物》知识梳理
- 微观经济学-范里安varian中级
- 《印章移交登记表》
评论
0/150
提交评论