资源描述:
《c语言程序设计12章位运算》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言允许对内存中的字节或字节内的二进制位进行运算,即位运算.12.1位运算符和位运算位运算符共6种:&
2、^~<<>>说明:1.位运算符中除了~是单目运算符外,其余均为二目运算符,即要求运算符两侧各有一个运算对象.2.运算对象只允许是整型或字符型数据.包括:char,short,int,long,unsigned.第十二章位运算12.1.1“按位相与”运算符(&)作用:对参加运算的两个二进制数按位进行逻辑与运算.规则:0&0=0,1&0=0,0&1=0,1&1=1例如:a=1,b=2,则:a&b=0000000010000000
3、011111110111111110000000000000000aba&b用途:“与”0可以屏蔽掉某些位,“与”1可以筛选出某些位。典型的用法有:清零。欲对一个字节清零,通常是“与”上0x00。取出一个数中的某些指定位。比如有一个整数a,欲取出它的低8位,应:000010010000110011111111000000000000100100000000a0x00ffc12.1.2“按位相或”运算符(
4、)作用:对参加运算的两个二进制数逐位进行逻辑或运算.规则:0
5、0=0,1
6、0=1,0
7、1=1,1
8、1=1例如:a=1,b=1,
9、则:a
10、b=1.000000010000000011111111111111111111111111111111aba
11、b用途:“或”1可以屏蔽掉某些位,“或”0可以筛选出某些位。典型的用法主要是:置1。欲对某些位置1,只需在相应位上“或”1便可。例如:a=15,b=0,则:a^b=15.000011110000000000000000000000000000111100000000aba^b例:main(){inta=3,b=4;a=a^b;b=b^a;a=a^b;printf(“%d,%d”,a,b);}输出:4,30000
12、00110000000000000100000000000000011100000000aba0000001100000000b0000010000000000a12.1.3“按位异或”运算符(^)作用:对参加运算的两个二进制数按位进行逻辑异或运算.规则:0^0=0,1^0=1,0^1=1,1^1=0结论:利用异或运算,不必设置第三个变量就可以实现两个整型变量值的交换。用途:某位“异或”1要变,某位“异或”0不变。1)使指定位翻转。比如:要使一个字节的低四位翻转,只需异或0x0f。00100011a00001111a0x0f001
13、011002)清零。一个整型(含字符型)数据“异或”自身,便清零.00100011aa0000000000100011a12.1.4“按位取反”运算符(~)作用:对一个二进制数按位取反,是一个单目运算符.如:a=15则~a=6552000000000000011111111111111110000a~a注意:~和!运算符是两个完全不同的运算符。~的优先级与++,,!相同,且结合性都是从右至左。例如:main(){inta=0,b=1;printf(“%d,%d”,~a,~b);printf(“%d,%d”,!a,!b)
14、;}运行结果:1,21,0000000000000000011111111111111110~0应用举例:若有一个整数a,想使它最低一位为0(即屏蔽d0位),而其它位不变。请问如何操作?方法是:a=a&~1;请问可用a=a&0xfffe;吗?答:对于以16位存放一个整型数据的计算机系统,后者也是可以的。但对于以32位(或更多位)存放一个整型数据的系统(如VAX11/780),后者是不可以的。因此,后者的可移植性很差;而前者则适合于任何系统,程序的可移植性好!00001011000000001111111011111111a0x
15、fffe0000101100000000111111101111111100000010000000000000000000000000a0xfffe11111110111111111111111111111111~116位整型32位整型12.1.5左移位运算(<<)作用:将操作数的各个二进位顺序左移,右端空出的位补0,而移出左端之外的位则丢失.如:a<16、于无符号数,左移1位,相当于乘2;左移n位,则乘2n。但是此结论只适用于该数左移时被溢出的最高位中没有1的情况。(2)对于用补码表示的正数,如果左移出的全部是0,且移出后的最高位仍为0时,数据不会溢出。(3)对于用补码表示的负数,如果左移出的全部是