第12章位运算12.1位运算符和位运算12.2位运算举例12.3位段位运算:是指进行二进制位的运算。12.1位运算符和位运算C语言提供的位运算符:&按位与|按位或∧按位异或~取反<<左移>>右移说明:1、位运算符中除了~以外,均为二目运算符。2、运算量只能是整型或字符型的数据,不能为实型数据。一、“按位与”运算符(&):规则:参加运算的两个运算量,如果两个相应位都为1,则该位结果值为1,否则为0。例如:X=10001001Y=11101110X&Y=10001000按位与的特殊用途:1、清零。方法:与一个各位都为零的数值相与,结果为零。2、取一个数x中某些指定位。方法:找一个数,此数的各位是这样取值的:对应x数要取各位,该数对应位为1,其余位为零。此数与x相就可以得到x中的某些位。例:设X=10101110(1)取X的低4位(2)取X的bit2、bit4、bit6位二、“按位或”运算符规则:参加运算的两个运算量,如果两个相应位中有个为1,则该位结果值为1,否则为0。例如X=10001001Y=11101110X|Y=11101111按位或的特殊用途:常用来对一个数据的某些位置1。方法:找一个数,此数的各位是这样取值的,对应x数要置1的位,该数对应位为1,其余位为零。此数与x相或就可使x中的某些位置1。例:使x=10100000的低4位为1。三、“异或”运算符规则:参加运算的两个运算量,如果两个相应位为“异”(值不同),则该位结果值为1,否则为0。例如X=10001001Y=11101110X^Y=01100111异或运算的应用:(1)使特定位翻转:找一个数,此数的各位是这样取值的:对应x数要转的各位,该数对应位为1,其余位为零。此数与x相或即可。例:x=10101110,使x低4位翻转(2)与0相异或,保留原值。例、四、“取反”运算符~对一个二进制数按位取反,即将0变为1,1变为0。例:0100001110010111取反1011110001101000注意:~运算符的优先级别比算术运算符、关系运算符、逻辑运符和其它运算符都高。例:使一个数a的最低位为零,可以表示成:a&~1因为,~1=1111111111111110。五、左移运算符《将一个数的各二进制全部左移若干位。(左丢弃,右补0)例:a=a<<2将a的二进制数左移2位,右补0。若左移时舍弃的高位不包含1,则数每左移一位,相当该数乘以2。六、右移运算符》将一个数的各二进制位全部右移若干位。(正数左补0/负数左补1,右丢弃)例:a=a>>2将a的二进制数右移2位。将一操作数左移一位,相当于将其乘2。将一操作数右移一位,相当于将其除以2。因此,可以用移位操作代替部分乘除操作,只要不产生溢出,这种代替是正确的。(用CF标志判别无符号数运算是否溢出,CF=1,表示溢出。用OF标志判别有符号数运算是否溢出,OF=1,表示溢出)。七、位运算符与赋值运算符结合,组成扩展的赋值运算符。&=,例:a&=b相当于a=a&b|=,例:a|=b相当于a=a|b>>=,例:a>>=b相当于a=a>>b<<=,例:a<<=b相当于a=a<>4(2)设置一个低4位全为1,其余为0的数~(~0<<4)(3)将上面两者进行&运算。程序:main(){unsigneda,b,c,d;scanf(“%o”,&a);b=a>>4;c=~(~0<<4);/*0x000f*/d=b&c;printf(“%o\n%o\n”,a,b);}例[11.2]将a进行循环右移,如原来右端3位移到最左端3位。1101111110101011->0111101111110101注意,不能直接使用>>运算符,因为,>>运算符使左面添0或添1。算法:设需要循环右移的数是一个整数(两字节)。移动n位(1)将a的右端n位先放到中间变量b的高n位中。(左移16-n位)b=a<<(16-n);(2)将a右移n位,其左面n位补0。c=a>>n;(3)将c与b进行按位或运算。c=a|b程序:main(){unsigneda,b,c;intn;scanf("a=%o,n=%d",&a,&n);b=a<<(16-n);c=a>>n;c=c|b;printf(“%o\n%o”,a,c);}12.3位段C语言允许在一个结构体中以位为单位来指定其成员所占内存,这种以位为单位的成...