




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c语言设计(第二版) -教学课件,制作人: 黄 荧 制作人单位:河师大数学与信息科学学院,第十二章 位运算(按位运算),几种关于二进制的按位运算: 1 按位与、按位或 2 异或、取反 3 左移、右移 4 位段,00000011 &) 00000101 00000001,00110000 |) 00001111 00111111,按位运算的用途:,用位运算可以实现一个字节存放多个数据!,1 按位运算主要在编写系统软件和应用软件中使用 2 按位运算能实现在一个字节中存储多个标志性数据 如,一个取值为0,1的标志变量只需要1个数位; 存放黑白两色也只需要1个数位. 即使存放8种颜色也仅只需要3个数位. 3 利用按位运算可以非常方便的从一个字节中读取和写入一个或几个数位上的数据.,12.1 位运算符和位运算 (位:指的是二进制的位!),C语言提供的六种位运算:,说明: 1)除了取反运算以外,都是二元运算。 2)运算量只能是整型或字符型数据,不能是实型数据。,12.1.1 按位与运算符(&) (特别注意:&与&的区别),运算规则: 0&0=0, 0&1=0, 1&0=0, 1&1=1,如: 3&5=? (3)补=00000011 & (5)补=00000101 00000001 3&5=1,常用的特殊用途: 1)清零处理: a=a&0 2)取一个数的某些位: 设a为占2个字节的无符号数, (a) 若取a的高8位 c=a&(1111 1111 0000 0000)2 =a&(01777400)8 (b) 取a的低8位: c=a&(0000 0000 1111 1111)2 =a&(0377)8 3)保留一个数的某些位(其他位 置0): 如,若保留a的从右数第3,4,5,7,8位 a=a&(0000 0000 1101 1100)2 =a&(0334)8,12.1.2 按位或运算符(| ) (注意:|与|的区别),运算规则: 0|0=0 , 0|1=1 , 1|0=1, 1|1=1,如:求060|017=? 00110000 | ) 00001111 00111111 即,060|017=077,按位或的一个常用的特殊用途: 将某些数位上的值置为1: 如: 1)将a的低4位置1,高4位不变 作:a=a|(0000 1111)2 =a|(017)8 2)将a的高4位置1,低4位不变: 作:a=a|(1111 0000)2 =a|(0360)8,12.1.3 “异或“运算符(),运算规则: 00=0, 01=1, 10=1, 11=0 即,相同取0 ,相异取1,如:071052= ? 00111001 ) 00101010 00010011 071052=023,“异或“运算的3个特殊应用 : 与1作异或,使特定位翻转: 如:将a的低四位翻转: a=a(00001111)2 =a017 与0作异或,保留原值 a0=a 交换a, b的值,不用临时变量 要交换a, b的值,用下列3个赋值语句即可: a=ab; b=ba; a=ab b=b(ab)=abb =a0=a 类似地:a=(ab)(b(ab)=aabbb=00b=b,用”按位与”在某些位上做清零, 用”按位或”在某些位上做置1, 用”异或”在某些位上做翻转!,12.1.4 “取反”运算符(),(一元运算) 运算规则:0=1,1=0 如: 求025,其中025为整型数占2个字节。 025= (0000 0000 0001 0101)2 = (1111 1111 1110 1010)2 =0177752 特别注意:取反的值是与其所占字节数相关的!,“取反“运算的一个特殊应用 : 将一个数的最低位置零。 当整数为16位: a&(1111 1111 1111 1110)2=a&0177776 而当整数为32位: a&(1111 1110)2=a&037777777776 二者可以统一如下表示: a=a&1 15个1 因为当系统为16位时,1=1110 31个1 因为当系统为32位时, 1=1110,12.1.5 “左移“运算符(),an 功能: 将a的二进制数位依次左移n位,右边补零 如: a=15, a=a1; 15=(00001111)2 151=(00011110)2=036=30 类似的: a=15, a=a2; 152=(00111100)2=074=60 但是:a=128, a=a1; 128=(10000000)2 1281=(00000000)2=0 (出现溢出!) 很容易看出,当无溢出时: a1a*2 an a*2n,12.1.6 “右移“运算符(),an 作用:将a的各二进制数位依次右移n位,左边补0或补1。 无符号数:左补0 有符号数: a=0: 左补0 a0: 逻辑右移:左补0 算术右移:左补1 Turbo C采用的是算术右移。,如, 1)a=017 a2=(0000 1111)2 2 =(0000 0011)2=03 2) a=-7 a2=(11111001)2 2 =(11111110)2(补) =-2 另外: 与左移类似 a1a/2 (整除) ana/2n (整除) 但注意到负数的舍入方向与正数不同, -7/2=-4向远离0的方向舍入。,按位运算的用途:,用位运算可以实现一个字节存放多个数据!,1 按位运算主要在编写系统软件和应用软件中使用 2 按位运算能实现在一个字节中存储多个标志性数据 如,一个取值为0,1的标志变量只需要1个数位; 存放黑白两色也只需要1个数位. 即使存放8种颜色也仅只需要3个数位. 3 利用按位运算可以非常方便的从一个字节中读取和写入一个或几个数位上的数据.,12.1 位运算符和位运算 (位:指的是二进制的位!),C语言提供的六种位运算:,说明: 1)除了取反运算以外,都是二元运算。 2)运算量只能是整型或字符型数据,不能是实型数据。,12.1.1 按位与运算符(&) (特别注意:&与&的区别),运算规则: 0&0=0, 0&1=0, 1&0=0, 1&1=1,如: 3&5=? (3)补=00000011 & (5)补=00000101 00000001 3&5=1,练习2 -10&7=? (-10)补=11110110 & (7)补=00000111 00000110 即, -10&7=6,思考: 两个非零数的按位与运算结果可能为0吗? 你能举出一个例子吗?,练习1 10&7=? (10)补=00001010 & (7)补=00000111 00000010 即, 10&7=2,练习3 10&-10=? (10)补=00001010 & (-10)补=11110110 00000010 即, 10&-10=2,按位与运算的3个常用的特殊用途:,1)清零处理: a=a&0 2)取一个数的某些位: 设a为占2个字节的无符号数, (a) 若取a的高8位 c=a&(1111 1111 0000 0000)2 =a&(01777400)8 (b) 取a的低8位: c=a&(0000 0000 1111 1111)2 =a&(0377)8 3)保留一个数的某些位(其他位 置0): 如,若保留a的从右数第3,4,5,7,8位 a=a&(0000 0000 1101 1100)2 =a&(0334)8,12.1.2 按位或运算符(| ) (注意:|与|的区别),运算规则: 0|0=0 , 0|1=1 , 1|0=1, 1|1=1,如:求060|017=? 00110000 | ) 00001111 00111111 即,060|017=077,按位或的一个常用的特殊用途: 将某些数位上的值置为1: 如: 1)将a的低4位置1,高4位不变 作:a=a|(0000 1111)2 =a|(017)8 2)将a的高4位置1,低4位不变: 作:a=a|(1111 0000)2 =a|(0360)8,12.1.3 “异或“运算符(),运算规则: 00=0, 01=1, 10=1, 11=0 即,相同取0 ,相异取1,如:071052= ? 00111001 ) 00101010 00010011 071052=023,“异或“运算的3个特殊应用 : 与1作异或,使特定位翻转: 如:将a的低四位翻转: a=a(00001111)2 =a017 与0作异或,保留原值 a0=a 交换a, b的值,不用临时变量 要交换a, b的值,用下列3个赋值语句即可: a=ab; b=ba; a=ab b=b(ab)=abb =a0=a 类似地:a=(ab)(b(ab)=aabbb=00b=b,用”按位与”在某些位上做清零, 用”按位或”在某些位上做置1, 用”异或”在某些位上做翻转!,12.1.4 “取反”运算符(),(一元运算) 运算规则:0=1,1=0 如: 求025,其中025为整型数占2个字节。 025= (0000 0000 0001 0101)2 = (1111 1111 1110 1010)2 =0177752 特别注意:取反的值是与其所占字节数相关的!,“取反“运算的一个特殊应用 : 将一个数的最低位置零。 当整数为16位: a&(1111 1111 1111 1110)2=a&0177776 而当整数为32位: a&(1111 1110)2=a&037777777776 二者可以统一如下表示: a=a&1 15个1 因为当系统为16位时,1=1110 31个1 因为当系统为32位时, 1=1110,12.1.5 “左移“运算符(),an 功能: 将a的二进制数位依次左移n位,右边补零 如: a=15, a=a1; 15=(00001111)2 151=(00011110)2=036=30 类似的: a=15, a=a2; 152=(00111100)2=074=60 但是:a=128, a=a1; 128=(10000000)2 1281=(00000000)2=0 (出现溢出!) 很容易看出,当无溢出时: a1a*2 an a*2n,12.1.6 “右移“运算符(),an 作用:将a的各二进制数位依次右移n位,左边补0或补1。 无符号数:左补0 有符号数: a=0: 左补0 a0: 逻辑右移:左补0 算术右移:左补1 Turbo C采用的是算术右移。,如, 1)a=017 a2=(0000 1111)2 2 =(0000 0011)2=03 2) a=-7 a2=(11111001)2 2 =(11111110)2(补) =-2 另外: 与左移类似 a1a/2 (整除) ana/2n (整除) 但注意到负数的舍入方向与正数不同, -7/2=-4向远离0的方向舍入。,12.1.7位运算赋值运算符,&,|,b a=b,12.1.8不同长度的数据进行按位运算,不同长度的数据进行按位运算, 效果可能不同: 如:long a=2; int b=2; a=a; b=b; 所得到的结果是不同的。,12. 2 位运算举例,例12.1 取一个整数a从右端开始的47位。 (注意到,内存中的最低位是0位。),方法1:(最简单的方法) 右移4位,将所取位移至最低位:b=a4; 取出最低4位: c=b,方法2: 将方法1的017用反运算表示。 构造017的要点是: 用反运算构造一个高位为0,低4位为1的数。 a) 从0开始,0=00000(可16位,也可32位) b) 取反:0=11111 (可16位,也可32位) c) 左移4位使低4位为0(可一般化为n):04; c=(04); d=b,例12.1 取一个整数a从右端开始的47位。(程序),#include void main ( ) unsigned a, b, c, d; scanf (“%o“, ,方法2: b=a4; c=(04); d=b,考虑:一般地, 从右面的第m位开始取其右边的n位?,作: 1) b=a(m-n+1); (将第m位开始的n位移至最低位) 2) c=(0n); (构造低n位为1,高位为0的数) 3) a=b (利用按位与运算取出这n位),例12.2 右循环位移 。,即:将a各数位依次右移且将最低位上的溢出位放入最高位。 如:右循环位移1位.,右循环位移n位.,处理方法: 取出a中低n位放在b中高n位保存: b=an (a为无符号数) 将b与c作按位或即得所求:c=c|b,例12.2 右循环位移 。(程序),#include void main() unsigned a,b,c; int n; printf(“Enter unsigned a, int n:n“); scanf(“%o %d“, ,右循环位移方法: 取出a中低n位放在b中高n位保存: b=an 将b与c作按位或即得所求: c=c|b,12.3 位段 (位域),位段是为了使一个字节中的数位的读取更为方便直观而设置的. 位段是结构体中特殊的成员,它们是以数位来定义长度的,而不是以字节。,如, struct packed_data unsigned a:2; /*成员a为一个占2个二进制数位的位段。*/ unsigned b:6; /*b,c,d也为位段*/ unsigned c:4; unsigned d:4; int i; data;,(共4个字节),位段的引用,对位段可以象一般整型变量要样给它赋值,但需要注意的是:不要超出它的取值范围。 如: struct packed_data unsigned a:2; unsigned b:3; unsi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 隐名合伙协议书
- 2025年护理学常见疾病护理知识评估答案及解析
- 2025年急诊医学紧急处理与抢救措施测试卷答案及解析
- 2025年风湿免疫科风湿病诊断与治疗综合考核答案及解析
- 2025年康复医学常规治疗方法评估综合测试卷答案及解析
- 2025年疼痛医学技能操作考核答案及解析
- 购房后购房协议书
- 2025年影像科医学影像学检查诊断知识答案及解析
- 2025年放射科影像学诊断与解读模拟考卷答案及解析
- 去律所拟协议书
- 基础护理8章试题及答案
- 心理学教学课件 - 认知行为疗法
- 《汉语阅读教程》课件-2教学课件:汉语阅读教程L2
- 2025年广东专升本教育理论考纲解析
- 第三节集装箱吊具一集装箱简易吊具二集装箱专用吊具课件
- 拼多多手机开店流程图
- 高级社会工作师评审申请表
- 医疗废物知识要点培训
- 2024秋新人教版小学一年级艺术唱游·音乐上册《第一单元 奇妙的声音世界》教案设计
- GB/T 45255-2025公共信用综合评价规范
- 保护眼睛防近视课件
评论
0/150
提交评论