




已阅读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江苏连云港灌江农业发展集团有限公司招聘拟聘(第二批)考前自测高频考点模拟试题及参考答案详解1套
- 2025广西河池市天峨县自然资源局招聘机关事业单位编外聘用人员2人模拟试卷及一套参考答案详解
- 2025北京外国语大学附属外国语学校招聘模拟试卷及答案详解(历年真题)
- 2025年度青岛市园林和林业局所属事业单位青岛市园林和林业综合服务中心公开模拟试卷含答案详解
- 2025年济宁市任城区事业单位公开招聘工作人员(教育类)(125人)考前自测高频考点模拟试题及1套完整答案详解
- 2025湖北省三支一扶招募高校毕业生2000人模拟试卷及答案详解(全优)
- 2025年泰安新泰市市属国有企业公开招聘考前自测高频考点模拟试题附答案详解(完整版)
- 2025年长江工程职业技术学院人才引进24人模拟试卷及答案详解(全优)
- 2025福建福州市仓山区卫健系统招聘编内31人模拟试卷完整参考答案详解
- 仓库消防喷淋系统安装方案
- 氢气使用操作安全培训课件
- 呛奶窒息培训课件
- (正式版)DB61∕T 1511-2021 《托幼机构消毒卫生规范》
- 小学红色诗词教学课件
- DB15T 1948-2020 农科1号木地肤育苗移栽技术规程
- 生存分析教学课件
- 2024年湖南石油化工职业技术学院单招职业技能测试题库及答案
- 癫痫患者的麻醉管理
- 2025年党的知识竞赛试题库100题及答案(抢答版)
- 甲状腺疾病护理小讲课
评论
0/150
提交评论