第10章位运算_第1页
第10章位运算_第2页
第10章位运算_第3页
第10章位运算_第4页
第10章位运算_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 位运算10.1 进制转换【学习目标】(1) 掌握几种常用数制之间的转换方法(2) 理解位运算的实际应用(3) 能进行简单的位运算实例53 二进制的运算及进制转换二进制与其他进制的转换【实例任务】1. 将十进制888和0.8125转换成二进制数。转换过程如图10-1所示。2 | 8 8 82 | 4 4 4 余0 2 | 2 2 2 余0 0.18252 | 1 1 1 余0 22 | 5 5 余1 1(取整) 0.62502 | 2 7 余1 22 | 1 3 余1 1(取整) 0.2500 2 | 6 余1 22 | 3 余0 0(取整) 0.50002 | 1 余1 2 0 余1

2、 1(取整) 0.0000 8 8 8 = ( 1101111000)2 0.8125=(0.1 1 0 1)2 图10-1 数据转换过程图2.将十进制888与0.8125分别转换成八进制和十六进制数。转换过程如图10-2所示。 8 | 8 8 8 0.81258 | 1 1 1 余0 88 | 1 3 余7 6(取整) 0.5000 8 | 1余5 80余1 4(取整) 0.0000 8 8 8=(1570)8 0.8125=(0.64)8 16| 8 8 8 0.812516| 5 5余8 1616| 3 余7 D(取整) 0.0000 0余3 8 8 8=( 378)16 0.8125=

3、(0.D)16 图10-2 数据转换过程图3.将二进制数110101100110011101111转换为八进制和十六进制数。转换过程如图10-3所示。6546.357 (110 101 100 110.011 101 111)2 =( )8D66.778(1101 0110 0110.0111 0111 1)2 =( )16 图10-3 数据转换过程图4.将八进制数7654.32和十六进制数FDA0.B8转换为对应的二进制数。转换过程如图10-4所示。7654.32 ( )8=(111 110 101 100.011 010 )2FAD0.B8 ( )16= (1111 1101 1010 0

4、000.1011 1000)2图10-4 数据转换过程图【相关知识】1. 进位计数制进位计数制是一种科学的计数方法,它是累计进位方式计数的数制。在日常生活中,人们最常用的是十进制数。进位计数制中用到两个概念:基数和数位的位权。基数是指该进制中可以使用的数码的个数。如十进制中,可以使用的数码是09,故十进制的基数是10。位权是一个数,所表示的值的大小等于该数码乘以一个以基数为底的整数次幂,这个整数次幂数是该位的位权。如 12345=1102+2101+3100+410-1+510-2则该数个位数上的位权为100,十位数上的位权为101,百位数上的位权为102,小数点后第一位数上的位权为10-1,

5、小数点后第二位数上的位权为10-2。2. 几种常用的数制(1)十进制十进制是用0,1,2,8,9十个数码表示,遵循“逢十进一”的进位原则。其基数是10。如,(23.4)10=2101+3100+410-1(2)二进制二进制是用0,1两个数码表示,遵循“逢二进一”的进位原则。其基数是2。如,(1101.01)2=123+122+021+120+02-1+12-2(3)八进制八进制是用0,1,2,6,7八个数码表示,遵循“逢八进一”的进位原则。其基数是8。如, (123.45)8=182+281+380+48-1+58-2(4)十六进制十六进制是用0,1,2,8,9,A,B,C,D,E,F十六个数

6、码表示,遵循“逢十六进一”的进位原则。其基数为16。如, (1AB.3C)16=1162+A161+B160+316-1+C1623. 将二进制、八进制、十六进制数转换成十进制数方法是:将该非十进制数只需按位权展开做一次十进制运算就可以完成。如, (110101)2 =123+122+021+120+02-1+12-2 =8+4+0+1+0+0.25=(13.25)10 (1234)8=182+281+380+48-1 =64+16+3+0.5=(83.5)10 (1AB.2)16=1162+A161+B160+216-1 =256+160+11+0.125=(427.125)104. 将十进

7、制数转换成二进制、八进制、十六进制数方法是:将该十进制数整数部分除以待转换的进制数的基数,直到商为0为止;小数部分乘以待转换进制数的基数,取其整数部分,余下小数部分继续乘相应基数,直到积是整数或按要求保留的有效小数位数即可。5. 八进制数、十六进制数与二进制数之间的转换方法是采用8421码。它们的对应关系见表10-1 表10-1 二进制、八进制与十六进制的对应关系八进制二进制十六进制二进制十六进制二进制0000000008100010011000191001201020010A1010301130011B1011410040100C1100510150101D1101611060110E111

8、0711170111F1111八进制数中最大代码为7,7可用三个二进制位(111)来表示,而其它八进制代码0,1,2,3,4,5,6更能用三个二进制位表示。故把二进制数化为八进制数时,以小数点为中心,整数部分从小数点向前三个二进制位一组,小数部分从小数点向后三个二进制位一组(不足三位填0补足),这样每组就可用一位八进制数表示。如实例中(110 101 100 110.011 101 111)2 =(6546. 357 )8就是采用这样的转换方法。同理,十六进制代码中最大者为F,而F可用四位二进制位表示,故按以上转换方法把二进制数化为十六进制的数。如实例中(1101 0110 0110.0111

9、 0111 1)2=(D66.778 )16 就是采用这样的转换方法。 【课堂精练】1.将以下数制转换结果填写完整。 (110111)2 =123+122+021+120+_+_=(_)10 (3216)8=_+_+_+68-1 =(_)10 (E2F.C)16=_+_+_+_=(_)10 2.完成以下数制转换过程。 (256.34)10=(_)2 (5010.1)10=(_)8(1111.1)10=(_)16(EF42.C)16=(_)2(2410.2)8=(_)10(2410.2)8=(_)2(2410.2)2=(_)1010.2 位运算【学习目标】(1)理解位运算的实际应用(2)能进行简

10、单的位运算实例54 位运算符与运算功能两个数的几种位运算【实例任务】设a=255,b=10,对两个数a和b进行位运算并输出结果。程序运行结果如图10-5所示。 图10-5 程序的运行结果【程序代码】#include stdio.hmain()int a=255,b=10,i;/*定义3个整型变量*/ printf(The %d & %d is %dn,a,b,a&b);/*计算两个数的与运算*/printf(The %d | %d is %dn,a,b,a|b);/*计算两个数的或运算*/printf(The %d %d is %dn,a,b,ab);/*计算两个数的异或运算*/printf(

11、The %d is %dn,a, a);/*计算a进行取反运算的值*/printf(decimal ttshift left by t resultn);for(i=1;i9;i+) b=ai;/*使a左移i位*/printf(%dtt %dtt %dn,a,i,b); /*输出当前左移结果*/printf(decimal ttshift right by t resultn);for(i=1;ii;/*使a右移i位*/printf(%dtt %dtt %dn,a,i,b);/*输出当前右移结果*/getch(); 【相关知识】1位运算符C语言的发展与操作系统的发展密切相关,最初是为了编写UN

12、IX操作系统而设计的,到现在为止,几乎所有的操作系统和主流的应用软件都是由C语言来编写的。在C语言出现之前,操作各种硬件的主要开发工具是汇编语言,使用汇编语言编写的汇编程序具有体积小,运算速度快的特点。为了编写与汇编语言相当的程序,C语言引入了指针和位运算。这样使C语言既具有高级语言的特点,又具有低级语言的功能,因而具有广泛的用途和很强的生命力。位运算是指进行二进制位的运算。它的运算对象不是以字节为单位,而是对内存中存储数据的二进制位进行运算。每一个二进制位的值是0或1。一个字节由8个二进制位组成,其中最右边的一位称为“最低位”或“最低有效位”,即第0位,向左是第1位,第2位,依此类推,最左边

13、的一位是“最高位”或“最高有效位”。参与位运算的运算数据只能是整型数据或字符型数据,不能是实型等其他类型数据。由于所有的数据在计算机中均以二进制形式存储,所以计算机最基本的计算功能仅为二进制加法和逻辑运算。C语言提供了6中位运算符。其中除了运算符“”是单目运算符之外,其他的都是双目运算符,如表10-2所示。表10-2 位运算符位运算符含 义例 子运算功能&按位与a&ba和b按位与|按位或a|ba和b按位或按位异或aba和b按位异或按位取反aa按位取反左移a右移a2a右移2位2按位与运算符(&)按位与运算符“&”是双目运算符,其功能是对两个运算数据的对应二进制位进行与运算。参与运算的数据以二进制

14、补码方式出现,其运算规则是只有对应的两个二进制位均为1时,结果位才为1;否则为0。即:0&0=0; 0&1=0; 1&0=0; 1&1=1; 例如,设a=5,b=7,计算c=a&b的结果值。变量a 的二进制补码表示为00000101,变量b 的二进制补码表示为00000111。位与运算过程如下。 00000101 (a的二进制补码)&00000111(b的二进制补码) 00000101 (c=a&b)如果对于负数,要按其补码进行运算,例如,设a=-4,b=7,计算c=a&b的结果值。变量a 二进制补码表示为11111100,变量b 二进制补码表示为00000111。位与运算过程如下。11111

15、100 (a的二进制补码)&00000111(b的二进制补码) 00000100 (c=a&b)按位与运算规则可知,一个数的某二进制位与0相与,结果为0;与1相与,结果保留原值。据此,位与运算有如下两个特殊用途。清零:如果想将一个数a的某些位置0,即其全部的二进制位均为0,只需找另一个数b,其相应位为0,然后与a进行按位与运算即可。例如,设a=11101011,将a的左起2、3、5位置0,将结果存入变量c中。此题要将a的第2、3、5位置0,所以取一个数b,其左起的第2、3、5位为0,其他位为1,即b=10010111,然后将a与b按位与运算,结果存入变量c中。11101011(a)&10010

16、111(b)10000011(c=a&b)获取或保留一个数中的特定位:如果想获取数a的某些位或将数a的某些位保留,就与一个数b进行与运算,数b在该位取1。例如,设a=01101011,取a的左起3、4、5、8位的值,将结果存入变量c中。此题要取a的左起3、4、5、8位的值,所以取一个数b,其左起的第3、4、5、8位为1,其他位为0,即b=00111001,然后将a与b按位与运算,结果存入变量c中。01101011(a)&00111001(b)00101001(c=a&b)3按位或运算符(|)按位或运算符“|”是双目运算符,其功能是对两个运算数据的对应二进制位进行或运算。其运算规则是只有对应的两

17、个二进制位均为0时,结果位才为0;否则为1。即: 0|0=0; 0|1=1; 1|0=1; 1|1=1;参与运算的数据以二进制补码方式出现。例如,设a=9,b=5,计算c=a|b的结果值。此题变量a 的二进制补码表示为00001001,变量b 的二进制补码表示为00000101。位或运算过程如下。00001001 (a的二进制补码) | 00000101(b的二进制补码) 00001101 (c=a|b)按位或运算规则可知,一个数的某二进制位与1相或,结果为1;与0相或,结果保留原值。据此,位或运算有如下特殊用途,将一个数的某些特定位置1。例如,设a=0101010110011001,将a低八

18、位置1,高八位保留原值,结果存入变量c中。此题要将a的低八位均置1,高八位保留原值,所以取一个数b,使其低八位均为1,高八位均为0,即b=0000000011111111。然后将a与b按位或运算,结果存入变量c中。01010101 10011001 (a) | 00000000 11111 111(b) 00000000100111001 (c=a|b)显然,这样或的结果使a 的低八位均置为1,而高八位保留了原值。4按位异或运算符()按位异或运算符“”是双目运算符,其功能是对两个运算数据的对应二进制位进行异或运算。其运算规则是对应的两个二进制位的值不同时,结果位才为1;否则为0。即:0|0=0

19、; 0|1=1; 1|0=1; 1|1=0;参与运算的数据以二进制补码方式出现。例如,设a=7,b=9,计算c=ab的结果值。计算过程如下:00000111 (a的二进制补码) 00001001(b的二进制补码) 00001110 (c=ab)按位异或运算规则可知,一个数的某二进制位与1相或,可使1变0,0变1;与0相异或,结果保留原值。据此,按位异或运算有如下3个特殊用途:保留原值。一个数与0进行异或运算,保留原值。例如设a=01010110,b=00000000,令c=ab,则变量c得到的是a的原值。使特定位翻转。就是使将特定位中的1变为0,0变为1。例如,设a=11010011,将a低四

20、位翻转,使1变为0,0变为1,高四位不变。计算结果存入变量c中。此题要使a低四位翻转,高四位不变,因此设一个数b,使其低四位为1,高四位为0,即b=00001111。然后将a与b按位异或运算,结果存入变量c中。计算过程如下:11010011 (a) 00001111 (b) 11011100 (c=ab)交换两个变量的值,而不借助于临时变量。前面讲过,如果交换两个变量的值,要借助于一个临时变量。设有两个变量a和b,想将这两个变量a和b的值交换,需要设置一个临时变量c,交换变量值的语句组为:c=a;a=b;b=c; 。这里使用按位异或运算就可以不借助临时变量而实现a和b两个变量的交换。交换变量的

21、语句组为:a=ab;b=ba;a=ab;。例如,设a=3,b=4,交换变量a和b的值。可以使用以下的赋值语句实现:a=ab;b=ba;a=ab; 具体计算过程如下:00000011 (a)00000100(b)00000111(a) 00000100 (b)00000111(a) 00000011(b)00000111(a=ab) 00000011 (b=ba) 00000100 (a=ab)这样实现了两个变量a和b的交换,即a=4,b=3。5按位取反运算符()按位取反运算符“”为单目运算符,其功能是把运算数据按二进制位取反。其运算规则是操作数的某位二进制位为1,则取反为0;反之,当它为0时,

22、则取反为1。例如9是对十进制数9(00001001)按位取反,其运算为:(00001001) ,结果为:11110110。下面举一个例子说明运算符的应用。若某系统是以8位表示一个整数,假设有一个整数a,想使其最低一位为0,则可以用a=a&0376,0376的二进制数为11111110。如果a的值是八进制数075,则a&0376的运算可表示如下:00111101 &11111110 00111100 a的最后一个二进制数变成了0,但如果将C的源程序移植到以16位存放一个整数的计算机系统上,想将a的最后一位变成0,就不能用a=a&0376,而应该该为a=a&0177776,0177776的二进制数

23、为1111111111111110。这样改动使程序的移植性很差。但如果改用a=a&1,那么对8位和16位存放的一个整数的系统都适用,不必作任何修改。因为在以8位存储一个整数时,1的二进制补码形式为00000001,1的二进制补码形式为11111110。在以16位存储一个整数时,1的二进制补码形式为0000000000000001,1的二进制补码形式为1111111111111110。关于按位取反运算符要注意的是:运算符的优先级别高于其它的位运算符、算术运算符、关系运算符和逻辑运算符。例如:a&b,先进行a运算,再进行&运算。6按位左移运算符()左移运算符“”双目运算符,其功能是将运算数据中的每

24、个二进制位向左移动若干位,从左边移出去的高位部分被丢弃,右边空出的低位部分补零。例如,a=a)右移运算符“”双目运算符,其功能是将运算数据中的每个二进制位向右移动若干位,从右边移出的低位部分被丢弃。对于无符号数,左边空出的高位部分补0。对于有符号数,如果符号位为0(即为正数),则空出的高位部分补0;如果符号位为1(即为负数),空出的高位部分补0还是补1,与使用的计算机系统有关,有的计算机系统补0,称为逻辑右移;有的计算机系统补1,称为算术右移。例如,设a=15,则a2表示把00001111右移为00000011,结果为a=3。由此可以看出:位右移运算可以实现除数为2的整除运算,右移1位相当于该

25、数除以2,左移n位相当于该数除以2n。这样就可以将所有对2的整除运算转移为位移运算,从而提高程序的运行效率。8位运算的复合赋值运算符C语言不仅提供了算术复合赋值运算符号,而且提供了由位操作运算符和赋值运算符复合构成的位运算复合赋值运算符。位运算复合赋值运算符的运算规则是:首先进行两个操作数的位运算,然后再将结果赋值给左操作数。这种运算的规则如表10-3所示。表10-3 位运算复合赋值运算规则运 算 符含 义例 子等 价 于=左移赋值a=2a=a=右移赋值a=2a=a2&=按位与赋值a&=ba=a&b|=按位或赋值a|=ba=a|b=按位异或赋值a=ba=ab关于位运算的复合赋值运算符有以下几点

26、说明:(1)位运算复合赋值运算中,左操作数只能是变量,不能是表达式或常量,因为不能把一个表达式的值赋给一个常量或表达式。(2)位运算复合赋值运算符与赋值运算符属于同一优先级别,结合顺序从右向左。【课堂精练】1输入变量的值,然后按要求进行运算。程序的运行结果如图10-6所示。 图10-6 程序运行结果根据程序的运行结果,请将下面程序补充完整并调试。#include stdio.hmain() unsigned a,b,c,d; int n; scanf(%o,%d,&a,&n); _ /*将a右端n位移到b的高位中*/ c=an;/*将a右移n位,左端补0*/ _ /*c与b求或运算,存放到d中

27、*/ printf(a=%on,a); printf(a=%on,b); printf(a=%on,c); printf(a=%on,d); getch(); 2获取一个无符号数据从第p位开始的n位二进制数据,假设数据右端对齐,第0位二进制数在数据的最右端,获取结果要求右对齐。程序的运行结果如图10-7所示。 图10-7 程序的运行结果 根据程序的运行结果,将下面补充完整。#include stdio.h/* 函数getbits获得从第p位开始的n位二进制数 */unsigned int getbits(unsigned int x,unsigned int p,unsigned n)/*定义

28、函数*/ unsigned int a,b; _ /* a右移p+1位(从0开始):0000 0000 0000 1111*/ _ /*0取反再左移n位,再赋给变量b*/* 运算过程为: 0: 0000 0000 0000 00000: 1111 1111 1111 111104: 1111 1111 1111 0000(04): 0000 0000 0000 1111a&b的结果为:0000 0000 0000 1111 */ return a&b; /*返回a&b的值*/main() unsigned int a=123,b;/*a的二进制形式为:0000 0000 0111 1011*/ b=getbits(a,2,4);/*调用函数getbits */ printf(a=%utb=%un,a,b); printf(a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论