资源描述:
《第12章 位运算》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十二章位运算位运算及其应用一、位运算的分类:位逻辑运算、位移运算两种二、位逻辑运算[符]:&
2、^~【位逻辑运算的特点】▲只作用于整型、字符型数据;▲作用于整型、字符型数据的每个二进制位,不是数的整体▲而一般逻辑运算是作用数的整体,不是数的每个二进制位。运算结果是二进制数。1、按位与运算符(&):1)运算规则:0&0=01&0=00&1=01&1=1▲只要对应位上的值均为1则该位上的结果值为12)特殊作用。①将一个存储单元各位清0②取某个数中的某些位。▲方法:将本数与某个特定数按位与运算即可。2、按位或运算符(
3、)1)运算规则:0
4、0=01
5、0=
6、10
7、1=11
8、1=1▲只要对应位上的值其中一个为1则该位上的结果值为12)特殊作用。①常用于将一个数的某些特定位置为1▲方法:将本数与某个特定数按位或运算即可。3、按位异或运算符(^)1)运算规则:0^0=01^0=10^1=11^1=0▲只要对应位上的值互不相同则该位上的结果值为12)特殊作用[p300]。①使某些特定的翻转②任何数与0相异或结果保留原数本身③交换两个变量的值不用中间变量。a=a^bb=b^aa=a^b▲注意给变量赋值的先后顺序。4、按位异求反运算符(~)1)运算规则:~0=1~1=0▲对每个上的值按位求反:1变为0;0变为1
9、。▲注意以上位逻辑运算的优先级别。▲注意:~运算符比算术运算、关系运算、逻辑运算和其它运算的优先级别都高。三、位移运算[符]:<<和>>1、左位移运算符(<<):1)运算规则:a=a<>)]1)运算规则:a=a>>n将a中所有位向右移动n位。2)运算的作用:相当于除法运算。右移一位相当于除以2。【注意】注意数的符号问题[即正负的问题]▲对于无符号数[正数]右移时高位补以0。▲对
10、于有符号数,高位为0[正数]右移时高位补以0。▲对于有符号数,高位为1[负数]时:①右移时高位补以0,称之为“逻辑位移”。②右移时高位补以1,称之为“算术位移”。▲TC采用“算术位移”,高位补以1。左位移运算符(<<)12.1.7位运算赋值运算符位运算符与赋值运算符可以组成复合赋值运算符如:&=,
11、=,>>=,<<=,∧=例如,a&=b相当于a=a&b。a<<=2相当于:a=a<<2。12.1.8不同长度的数据进行位运算如果两个数据长度不同(例如long型和int型)进行位运算时(如a&b,而a为long型,b为int型),系统会将二者按右端对齐
12、。如果b为正数,则左侧16位补满0。若b为负数,左端应补满1。如果b为无符号整数型,则左侧添满0。12.2位运算举例例12.1取一个整数a从右端开始的4~7位。可以这样考虑:①先使a右移4位。见图12.3。图12.3(a)是未右移时的情况,(b)图是右移4位后的情况。目的是使要取出的那几位移到最右端。图12.3右移到右端可以用下面方法实现:a>>4②设置一个低4位全为1,其余全为0的数。可用下面方法实现:~(~0<<4)~0的全部二进制为全1,左移4位,这样右端低4位为0。见下面所示:0:0000…000000~0:1111…111111~0<<
13、4:1111…110000~(~0<<4):0000…001111③将上面二者进行&运算。即(a>>4)&~(~0<<4)根据上一节介绍的方法,与低4位为1的数进行&运算,就能将这4位保留下来。程序如下:main(){unsigneda,b,c,d;scanf("%o",&a);b=a>>4;c=~(~0<<4);d=b&c;printf("%o,%d%o,%d",a,a,d,d);}运行情况如下:331331,217(a的值)15,13(d的值)输入a的值为八进制数331,即十进制数217,其二进制形式为11011001。经运算最后得
14、到的d为00001101,即八进制数15,十进制数13。可以任意指定从右面第m位开始取其右面n位。只需将程序中的“b=a>>4”改成“b=a>>(m-n+1)”以及将“c=~(~0<<4)”改成“c=~(~0<<n)”即可。例12.2循环移位。要求将a进行右循环移位。见图12.4。图12.4表示将a右循环移n位。即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。今假设用两个字节存放一个整数。为实现以上目的可以用以下步骤:①将a的右端n位先放到b中的高n位中。可以用下面语句实现:b=a<<(16-n);②将a右移n位,其左面高位n
15、位补0。可以用下面语句实现:c=a>>n;③将c与b进行按位或运算。即c=c
16、b;程序如下:main(){unsigneda,b,c;i