




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计教程 (第4版) 第11章 位运算 李丽娟 2013年2月 本章主要内容 1.按位取反运算 2.按位左移运算 3.按位左移运算 4.按位与运算 5.按位或运算 6.按位异或运算 7.复合位运算 第11章 位运算 C语言提供的位运算符共有6个: 运 算 符含 义优 先 级表达式样例 按位取反14a 按位右移11a4 i的二进制表示为: i=(85)10=(0000 0000 0101 0101)2 对i按位取反: i=(1111 1111 1010 1010) 2 此时,i的最高位为1,代表负数。为原数的补码形式。 实际上:i =(1111 1111 1010 1010) 2| 反码+1 =(1000 0000 0101 0101) 2 +1 =(1000 0000 0101 0110) 2 =-86 (注:负数取反时。符号位不变) 11.1 按位取反运算符 对于无符号整型数:unsigned int i=85; i的二进制表示为: i=(85)10=(0000 0000 0101 0101)2 对i按位取反: i=(1111 1111 1010 1010) 2 此时,i的最高位为1,仍然代表正数。 因此,i值就是i按位取反后的值: i=(1111 1111 010101)2 =(65450)10 11.1 按位取反运算符 小结: (1) C语言允许对有符号整型数进行位运算 缺点:不便于掌控程序本身的计算结果。 (2) 位运算适合于无符号的整型数 对于需要进行位运算操作的数据,通常应定义 成unsigned型。 (3) 位运算符不适合于浮点型数据。 11.1 按位取反运算符 【例11-1】 阅读下面的程序,了解不同类型的变量进行按位取 反运算的规则。 /*example11_1.c 了解按位取反运算的规则*/ #include void main() int i1=32767,i2=-32767,i3=10,i4=-10,i; unsigned int u1=65535,u2=0,u3=10,u; printf(“i1=%d,i1=%dn“,i1,i1); printf(“i2=%d,i2=%dn“,i2,i2); printf(“i3=%d,i3=%dn“,i3,i3); printf(“i4=%d,i4=%dn“,i4,i4); printf(“u1=%u,u1=%un“,u1,u1); printf(“u2=%u,u2=%un“,u2,u2); printf(“u3=%u,u3=%un“,u3,u3); 11.2 按位左移运算 按位右移表达式的形式: mn; 作用:将m的二进制位全部右移n位。 左边空出的位,分两种情况处理: m为正数,则m右移n位后,左边补n个零; n为负数,则m右移n位后,左边补n个符号位。 正数情况:unsigned int m=65; 即:m=(65)10=(0000 0000 0100 0001)2 则: m2= 00 0000 0000 0100 00 01 补入 丢弃 于是:m2=(0000 0000 0001 0000)2=260 11.3 按位右移运算 负数情况: n=(65)10=(1000 0000 0100 0001)2 在计算机中,65的补码为:1111 1111 1011 1111 (n)补2=11 1111 1111 1011 1111 补入 丢弃 即:n2=(1111 1111 1110 1111)补 =(1000 0000 0001 0001)2 =17 11.3 按位右移运算 小结 在C语言中,按位右移后左边补零的情况称为“逻辑右移” ,左边补1的情况称为“算术右移”。 亦即,对于整型变量m: 若m0,则mn为逻辑右移; 若mn为算术右移。 思考 (1) 请分析逻辑右移和算术右移的不同之处; (2) 请分析逻辑右移和算术右移运算时应注意些什么。 阅读【例11-3】的程序,了解按位左移运算的规则和作用。 11.4 “按位与” 运算符 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二进制值 对负数需要用其补码来计算 b|原码=(21)10=(1000 0000 0001 0101) b|补码=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二进制值 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二进制值 | 0000 0000 0001 0101 b的二进制值 0000 0000 0101 1101 a|b 结果:a 对负数需要用其补码来计算 b|原码=(21)10=(1000 0000 0001 0101) b|补码=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二进制值 | 1111 1111 1110 1011 b的补码 1111 1111 1110 1011 a|b的补码 结果:a|b=(1000 0000 0001 0101)2=21。 注意:a|b的补码并不是最后的结果。 11.5 “按位或”运算符 | 小结 (1)与0进行“按位或”运算的结果将保持自身的值不变;与l进行“ 按位或”运算的结果将变成1。 (2)实际应用时,可用来提取变量某些字节的值或将变量某些 字节的值变为1。例如: a的二进制值为:x x x x x x x x x x x x x x x x (x表示即可为0也可为1) b的二进制值为:0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 a|b的二进制值: x x x x x x x x 1 1 1 1 1 1 1 1 思考 请编写程序,从键盘输入一个无符号的整型数x,将x从低位数起的奇数位全 部换成1(如果原来该位值为1,则仍为1不变),偶数位保持不变。 参考【例11-5】的程序,了解按位或运算的规则和作用。 11.6 “按位异或”运算符 运算规则: 若a、b对应位的值相同,则该位的结果为0,否则为1。 即:00=0 01=1 10=1 11=0 按位异或表达式的一般形式:ab 作用:将变量a、b的二进制值按位进行异或运算。 若有:unsigned int a=73,b=21; 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二进制值 0000 0000 0001 0101 b的二进制值 0000 0000 0101 1100 ab 结果:a 对负数需要用其补码来计算 b|原码=(21)10=(1000 0000 0001 0101) b|补码=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二进制值 1111 1111 1110 1011 b的补码 1111 1111 1010 0010 ab的补码 结果:ab=(1000 0000 0101 1110)2=94。 注意:ab的补码并不是最后的结果。 11.6 “按位异或”运算符 小结 (1) 任何二进制值与0相“异或”时,其值保持不变,与1相“异 或”时,其值取反。 (2) 实际应用时,可实现对指定位的二进制值取反或对指定位 的二进制值保持不变。 思考 (1) 怎样通过异或运算实现交换两个变量的值? (2) 编写程序,将两个无符号的整数x和y从低位数开始的奇数 位上的值取反,偶数位上的值保持不变,改变后再交换两变量 的值。 参考【例11-6】的程序,了解按位异或运算的规则和作用。 11.7 复合位运算符 位运算符和赋值运算符一起可以组成复合位运算赋值运算符。 运 算 符表 达 式等价的表达式 a=a |=a|=b;a=a|b; =a=b;a=ab; =a=b;a=ab; 11.8 程序范例 思考1: 编写程序,取一整型数 a的二进制从右端开始的 4 7 位。 提示: 先使 a 右移 4 位。即: a(7 4 + 1 ) a4 设置一个低4位全为1,其余全为0 的数b。即: ( 0 main( ) unsigned a, b, c, d ; scanf(“%ud”, b = a4; / b=a(m-n+1) / c = (0 n ; 将c与b进行按位或运算。 c = c | b 提示: 程序如下: #include main( ) unsigned a,b,c; int n; scanf(“a=%ud,n=%d”, b = an; c = c| b; printf(“%udn%udn”,a,c); 11.8 程序范例 【例11-7】 在互联网络中,计算机都是通过IP地址进行通信的,计 算机中的每一个IP地址都用一个32位的unsigned long型变量保存 ,它分别记录了这台计算机的网络ID和主机ID。请编写程序,从一 个正确的IP地址中分离出它的网络ID和主机ID。 分析:一个32位的IP地址可以分解成4个字节,每一个字节代表了IP地址 的段,如202.103.96.68就代表了一个合法的IP地址。 若用ip表示某计算机的IP地址,用mask表示其子网掩码。 则:ip&mask即可获得该计算机的网络ID; 其主机ID为:ip-(ip&mask)。 用sect1sect4代表IP地址从高到低4个字节的值;ip代表计算机的IP地 址;netmask代表计算的子网掩码;netid和hostid分别代表计算机的网 络IP和主机IP。 IP地址和子网掩码的值都通过键盘输入来模拟获取。 函数:unsigned long getIP()来获取IP和子网掩码的值。 参见程序: example11_7.c 11.8 程序范例 【例11-8】 编写程序,设计函数unsigned power2( unsigned number,unsigned pow),通过调用函数, 计算number2pow。将计算结果返回并分别用整数形式 和二进制形式输出。 分析:number2pow相当于将number乘以pow个2。 如523,相当于5222。而对于无符号整型变量,左移1位 相当于将其乘以2,因此,计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新型茶饮品牌在2025年市场扩张策略与竞争分析报告
- 2025年特种紧固件行业需求分析及创新策略研究报告
- 2025年医疗软件行业需求分析及创新策略研究报告
- 2025年茶油行业需求分析及创新策略研究报告
- 2025年康复医疗行业规模分析及投资前景研究报告
- 2025年新视觉传达就业协议书
- 2025年新出轨少分财产协议书
- (2025年标准)漏水补漏协议书
- (2025年标准)健身娱乐会员协议书
- 快递企业员工劳动合同
- 2025至2030年中国应急产业市场供需现状及投资战略研究报告
- 中医院临床路径培训课件
- 湖南省岳阳市岳阳楼区2024-2025学年八年级下学期期末考试英语试题(含笔试答案无听力音频及原文)
- 基于SERVQUAL模型的物业公司服务质量提升研究
- 精索静脉曲张治疗-洞察及研究
- 2025年秋期部编人教版六年级上册语文全册核心素养教案(教学反思无内容+二次备课版)
- 养老护理员培训班课件
- 不买社保的劳动协议书
- 服装厂开业搞活动方案
- 临水作业安全培训
- 清洁与消毒培训
评论
0/150
提交评论