版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十二章 位运算 概述 位运算符 位运算举例概述 语言是为描述系统而设计的,因此它应当具有汇编语言所能完成的一些功能。语言既具有高级语言的特点,又具有低级语言的功能,因而具有广泛的用途和很强的生命力。前面介绍的指针运算和本章将介绍的位运算就很适合于编写系统软件的需要。 所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进位的问题。例如,将一个存储单元中的各二进位左移或右移一位,两个数按位相加等。语言提供位运算的功能,与其它高级语言(如PASCAL)相比,它显然具有很大的优越性。 前面我们介绍了有关位的知识,这一部分对 对二进制运算能有较好的理解,请复习位运算符表12.1 运算符 含义
2、& 按位与 | 按位或 按位异或 取反 右移 说明:位运算符中除以外,均为二目(元)运算符,即要求两侧各有一个运算量。运算量只能是整型或字符型的数据,不能为实型数据。 参加运算的两个运算量,如果两个相应的位都为,则该位的结果值为,否则为。即: =:=;1=;1; 例如:并不等于不等于,这是按位与。先把和以补码表示,再进行按位与运算。 的补码: 5的补码: 1 -: 它是的补码。因此,的值得。一、“按位与”运算符() 如果想将一个单元清零,即使其全部二进位为,只要找一个数,它的补码形式中各位的值符合以下条件:原来的数中为1的位,新数中相应位为。然后使二者进行 运算。 按位与特殊的用途:清零。如:
3、原有数为,另找一个数,设它为,它符合以上条件,即在原数为的位置上,它的位值均为。将两个数进行运算: 00101011 & 10010100 - 0000000011)也可以.取一个数中某些指定位。如一个整数(个字节),如只想要其中的低字节。只需将与()8按位与即可 - a |00 10 11 00 | 10 10 11 00 | b |00 00 00 00 | 11 11 11 11 | c |00 00 00 00 | 10 10 11 00 | - 要想将哪一位保留下来,就与一个数进行运算,此数在该位取,如:有一数 1 010 1 00,想把其中左面第、.位保留下来,可以这样 01010
4、100 (十进制数84) (&) 00111011 (十进制数59) - 00010000 (十进制数16) 即=,=,=b=6 3 保留某位 00110000 (|) 00001111 - 00111111 -把低位全置。如果想使一个数a的低位改为,只需将a与1进行按位或运算可。 按位或运算常用来对一个数据的某些位定值为.如是一个整数(1位),有表达式 |则低位全置为。高位保留原样。 二、按位或运算符(| )两个相应位中只要有一个为,该位的结果值为。 即:|;|=;|0;|=。 例如 |将八进制数与八进制数进行按位或运算。即:=: =; 1;如: 00111001 (十进制数5,八近制数)
5、00101010 (十进制数42 , 八进制数 0 5 2 ) 00010011 (十进制数19 , 八进制数0 2 3 )即5,结果为(八进制数)。异或的意思是:判断两个相应的位值是否为“异”,为“异”(值不同)就取真(),否则为假()。 三、“异或”运算符( ),也称运算符 它的规则是:参加运算的两个相应位同号,则结果为(假);异号则为(真)。可以将它与进行运算,即结果值的低位正好是原数低位的翻转。要使哪几位翻转就将与其进行运算的数中该几位置为即可。这是因为原数中值为的位与进行运算得,原数中的位值与进行运算的结果得。 应用: ()使特定位翻转假设有,想使其低位翻转,即:变为,变为。因为原数
6、中的与进行运算得,得,故保留原数。 ()与相,保留原值如 00001010 00000000 - 00001010()交换两个值,不用临时变量 假如,b=。想将和b的值互换,可以用以下赋值语句实现: =b; ba; =b;是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,1变。例如.是对八进制数(即二进制数)按位求反。 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0即八进制数。因此,的值为八进制数,不要以为的值是-5。 四、“取反”运算符()运算符的应用 想使一个数的最低一位为,若一个整数为 位,可以用
7、即二进制数,如果的值为八进制数, 的运算可以表示如下 00 00 00 00 00 11 11 01(&)11 11 11 11 11 11 11 10 00 00 00 00 00 11 11 00 的最后一个二进位变成。若将源程序移植到以位存放一个整数的计算机系统上呢?由于一个整数用个字节(位表示),想将最后一位变成就不能用了。为了适应以位存放一个整数的计算机系统,应改用 这样改动使移植性差了,可以改用 它对以位和以位存放一个整数的情况都适用,不必作修改。因为在以个字节存储一个整数时用来将一个数的各二进位全部左移若干位。例如 将a的二进制数左移位,右补。若,即二进制数,左移位得00 11
8、11 00 ,即十进制数。五、左移运算符()高位左移后溢出,舍弃不起作用。左移位相当于该数乘以,左移位相当于该数乘以。上面举的例子=,即乘了.但此结论只适用于该数左移时被溢出舍弃的高位中不包含的情况。例如,假设以一个字节(8位)存一个整数,若为无符号整型变量,则时,左移一位时溢出的是,而左移位时,溢出的高位中包含。 可以看出,a=左移位时相当于乘,左移2位后,值等于0。左移比乘法运算快得多,有些编译程序自动将乘的运算用左移一位来实现,将乘n的幂运算处理为左移位。表示将a的各二进位右移位。移到右端的低位被舍弃,对无符号数,高位补。如=时:为 00001111 , a 2为 00000011 :
9、11此二位舍弃 右移一位相当于除以,右移位相当于除以n。 在右移时,需要注意符号位问题。对无符号数,右移时左边高位移入。对于有符号的值,如果原来符号位为(该数为正),则左边也是移入,如同上例表示的那样。如果符号位原来为(即负数),则左边移入还是,要取决于所用的计算机系统。有的系统移入,有的移入。移入0称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。例如,的值为八进制数。 六、右移运算符():1 : (逻辑右移时) 1: (算术右移时)在有些系统上,1 得八进制数,而在另一些系统上可能得到的是。urbo C和其它一些编译采用的是算术位移,即对有符号数右移时,左面移入高位的是七、位运算符与
10、赋值运算符结合可以组成扩展的赋值运算符 如: =,| =, =, =, =例如, = 相当于b。 ( 7 4 + 1 ), 即a 4 2.设置一个低4位全为0的数。位运算举例可用下面方法实现。 () 即将一个全的数左移位,这样右端低位为。见下面所示: : : 1 : 0 ():将上面二者进行运算。即: () 根据上一节介绍的方法,与低位为的数进行运算,就能将这n位保留下来。 程序如下: ( ) ,b,; (”n”,&); b=4 c= (); = c t(”nn”,a,); 运行情况如下: (的值) (的值) 的二进制数为 11 1,最后得到的结果为01 1 1,即八进制数。 可以任意指定从右
11、面第位开始取其右面位。只需将程序中的”b = ”改成“= ( - )”,以及将”c = ()”改成” c =(n)”即可。 将的右端位先放到b中的高位中。可以用下面语句实现: =(-n);将右移位,其左面高位位补。可以用下面语句实现: =;将与b进行按位或运算。即 c = | b ;程序如下: ( ) g ,b,; int ;例.2循环移位。要求将进行右循环移位。即将中原来左面(1-)位右移位,原来右端位移到最左面n位。今假设用两个字节存放一个整数。(”a=o,=”,); b(- n );=n ;= c | b ;t(”,);运行情况如下: =,= 75 有时存储一个信息不必用一个或多个字节,
12、可以在一个字节中放几个信息。例如,”真”或 ”假”用或表示,只需1位即可。例 位 段所谓位段是以位为单位定义长度的结构体类型中的成员。例如: struct packed- data unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int I data; 其中,b,、d,分别占位、位、人为地在一个字节中设几项。例如:、b、分别占位、位、位、位。 其中、b.共占位,占个字节多,不到个字节。它的后面为int 型,占个字节,在、b.之后的位空闲,从另一字节开头起存放。 注意,在存储单元中位段的空间分配方向,因机器而异。 对位段中的数据引用
13、的方法。如: data.a =2; data.b =7; data.c =9; 注意位段允许的最大值范围。如果写 data.a=8 就错了。因为它只占位,最大值为。在此情况下,自动取赋予它的数的低位。例如,的二进制数形式为,而data . a 只有位,取 1000 的低2位, data . a 得值。 关于位段的定义和引用,有几点要说明: 若某一位段要从另一个字开始存放。可以用以下形式定义: unsigned a:1; 一个存储单元 unsigned b:2; unsigned :0; unsigned c:3; (另一单元) 本来、b, c应连续存放在一个存储单元(字)中,由于用了长度为的位
14、段,其作用是使下一个位段从下一个存储单元开始存放。因此,现在只将、存储在一个存储单元中,另存放在下一个单元。.一个位段必须存储在同一存储单元中,不能跨两个单元。 如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。可以定义无名位段。如: unsigned a:1; unsigned : 2 ; (这两位空间不用) unsigned b : 3 ; unsigned c : 4 ;在a后面的是无名位段,空间不用。4.位段的长度不能大于存储单元的长度,也不能定义位段数组。位段可以用整型格式符输出。如: printf(“%d, %d, %d”, data.a, data.b, data.c); 当然,也可以用u、o、x等格式符输出。位段可以在数值表达式中引用,它会被系统自动地转换成整型数。如 data.a+5/data. 是合法的。1.如果int x=8,y=9;下列语句的执行结果是()。 x=xy; y=yx; x=xy;2.设变量x的二进制数是00101101,若想通过运算xy 使得x的高4位取反,低 4位不变,则y的二进制数应是(),八进制应是()。练 习3.如果两个操作数的相应位只有一个为 1, 运算符把结果中的对应位设置为 1 。 4. 运算符和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗合同管理规范制度
- 第一单元+任务二《诗歌朗诵》课件-2024-2025学年统编版语文九年级上册
- 石河子大学《影像诊断学》2021-2022学年第一学期期末试卷
- 防三无食品安全
- 石河子大学《包装容器与纸盒结构》2023-2024学年第一学期期末试卷
- 沈阳理工大学《数据库系统原理》2022-2023学年期末试卷
- 沈阳理工大学《科技文献检索与写作》2022-2023学年第一学期期末试卷
- 沈阳理工大学《产品形导思维设计》2022-2023学年第一学期期末试卷
- 规范人事档案和劳动合同
- 合股开店协议合同书模板
- 小议“双减”政策及其落实措施效果研究
- 【企业杜邦分析国内外文献综述6000字】
- 区域地质调查及矿产普查专业毕业实习周记范文原创全套
- 锥坡工程量计算(支持斜交、溜坡计算)
- 自然灾害风险管理
- 中国智库名录类别索引-社会智库
- 世界七大洲及各个国家的英文名字
- 管沟回填土、砂施工方案及工艺方法
- 情绪的身体密码-心理健康教育教案
- 2023年中考复习文言文比较训练-《诫子书》与“世家子弟最易犯”
- GB/T 4339-1999金属材料热膨胀特征参数的测定
评论
0/150
提交评论