1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,第十二章,位运算,概念,位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。,例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。,语言提供位运算的功能,与其他高级语言(如,PASCAL,),相比,具有很大的优越性。,12,.1,位运算符和位运算,运算符 含义 运算符 含义,按位与,按位取反,|,按位或,右移,(1),位运算符中除以外,其他均为双目(元)运算符,即要求两侧各有一个运算量。,
2、2),运算量只能是整型或字符型的数据,不能为实型数据。,语言提供的位运算符有:,说明:,12.1.1“,按位与”运算符(),按位与是指:,参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。即:,,,例:,4,等于多少?按位与运算:,注意:,如果参加,&,运算的是负数(如,-4&-,5,),则要以补码形式表示为二进制数,然后再按位进行,“,与,”,运算。,00000100,(4),&,00000101,(5),00000100,(4),4&5,的值得,4,按位与的用途:,若想对一个存储单元清零,即使其全部二进制位为,只要找一个二进制数,其中各个
3、位符合以下条件:,原来的数中为的位,新数中相应位为。,然后使二者进行运算,即可达到清零目的。,(1),清零。,例:,原有数为,另找一个数,设它为,这样在原数为的位置上,该数的相应位值均为。将这两个数进行运算:,00101011,&,10010100,00000000,(2),取一个数中某些指定位。,如有一个整数(个字节),想要取其中的低字节,只需将与,8,个,1,按位与即可。,0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0,a,b,c,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1,0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0,(3),保留某一
4、几)位的方法:与一个数进行运算,此数在该(几)位取。,例:,有一数,想把其中左面第、位保留下来,运算如下:,01010100,&,00111011,00,010,0,00,12.1.2“,按位或”运算符(,|,),两个相应的二进制位中只要有一个为,该位的结果值为。,即,|,,,|,,,|,,,|,例:,060|017,将八进制数,60,与八进制数,17,进行按位或运算。,00110000,|,00001111,00111111,应用:,按位或运算常用来对一个数据的某些位定值为。例如:如果想使一个数的低位改为,只需将与进行按位或运算即可。,例:,是一个整数(位),有表达式:,|,则低位全置为,
5、高位保留原样,12.1.3“,按位异或”运算符(,),按位异或运算符,也称,XOR,运算符。它的规则是:,若参加运算的两个二进制位,相同则结果为(假),相异则结果为(真),即,:00=0,,,01=1,,,10=1,,,11=0,即,:071052=023,(八进制数),00111001,00101010,00010011,例:,()使特定位翻转,设有,想使其低位翻转,即变为,变为。可以将它与进行,运算,即:,运算符应用:,01111010,00001111,01110101,运算结果的低位正好是原数低位的翻转。可见,要使哪几位翻转就将与其进行,运算的该几位置为即可。,因为原数中的与进行,运算
6、得,,得,故保留原数,。,例如:,012,00=012,()与相,,保留原值,00001010,00000000,00001010,()交换两个值,不用临时变量,例如:,。,想将和的值互换,可以用以下赋值语句实现:,ab;,ba;,ab;,(,),(,ab,的结果,,a,已变成),(,),(,ba,的结果,,b,已变成),(,),(,ab,的结果,,a,已变成),执行前两个赋值语句:,“,;,”,和,“,;,”,相当于,b=b(ab),。,再执行第三个赋值语句:,。由于,a,的值等于(,),,b,的值等于(,),因此,相当于,a=,,即,a,的值等于,,等于。,、的值实现互换。,即等效于以下两
7、步:,12.1.4,“,按位取反”运算符(),是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,将变。例如,是对八进制数(即二进制数)按位求反。,0000000000010101,(),1111111111101010,(,八进制数,177752),12.1.5,左移运算符(),左移运算符是用来将一个数的各二进制位全部左移若干位。,例如:,a=a),a,2,表示将,a,的各二进制位右移,2,位,移到右端的低位被舍弃,对无符号数,高位补,0,。,例如:,a=017,时,:,a,的值用二进制形式表示为,00001111,,舍弃低,2,位,11,:,a2=00000011,右移一位相当于除
8、以,2,右移,n,位相当于除以,2,n,。,在右移时,需要注意符号位问题:,对无符号数,右移时左边高位移入,0,;对于有符号的值,如果原来符号位为,0(,该数为正,),则左边也是移入,0,。如果符号位原来为,1(,即负数,),则左边移入,0,还是,1,要取决于所用的计算机系统。有的系统移入,0,有的系统移入,1,。移入,0,的称为“逻辑右移”,即简单右移;移入,1,的称为“算术右移”。,例:,a,的值是八进制数,113755,:,a:1001011111101101,(,用二进制形式表示),a1:0100101111110110 (,逻辑右移时,),a1:1100101111110110 (,
9、算术右移时,),在有些系统中,a1,得八进制数,045766,而在另一些系统上可能得到的是,145766,。,Turbo C,和其他一些,C,编译采用的是算术右移,即对有符号数右移时,如果符号位原来为,1,,左面移入高位的是,1,。,12.1.7,位运算赋值运算符,位运算符与赋值运算符可以组成复合赋值运算符。,例如,:&=,|=,=,=,=,例:,a&=b,相当于,a=a&b,a =2,相当于,a=a 4,目的是使要取出的那几位移到最右端。,设置一个低,4,位全为,1,其余全为,0,的数。,将上面、进行,&,运算。,实验,11,位运算,1.,实验目的:,(,1,)掌握按位运算的概念和方法,学会使用位运算符;,(,2,)学会通过位运算实现对某些位的操作。,2.,实验内容:编写程序,上机调试并运行。,(,1,)习题,12.2,。,(,2,)习题,12.4,。,(,3,)习题,12.5,。,






