180 likes | 376 Views
第十一章 位运算. 11.1 位运算. C 语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数(或字符型)。位逻辑运算包括 & 、 | 、 ^ 、 ~ 四种运算,移位运算有 << 、 >> 两种运算。其中 ~ 是单目运算符。. 11.2 按位与 &. 参与运算的量,如果相对应的两位都为 1 ,则该位的结果值为 1 ,否则为 0 ,即: 0&0==0 0&1==0 1&0==0 1&1==1 如: a 的值为 0x1234 , b 的值为 0xff , a&b 运算的结果 c 应为:
E N D
11.1 位运算 • C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数(或字符型)。位逻辑运算包括&、|、^、~四种运算,移位运算有<<、>>两种运算。其中~是单目运算符。
11.2 按位与& • 参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即: 0&0==0 0&1==0 1&0==0 1&1==1 • 如:a的值为0x1234,b的值为0xff,a&b运算的结果c应为: a 0001 0010 0011 0100 & b 0000 0000 1111 1111 c 0000 0000 0011 0100
11.2 按位与& • 按位与常用于将某个运算量的某些位清0或提取某些位的值,如本例中,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。
11.3 按位或| • 参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即: 0|0==0 0|1==1 1|0==1 1|1==1 • 如:a的值为0x1234,b的值为0xff,a|b运算的结果c应为: a 0001 0010 0011 0100 |b 0000 0000 1111 1111 c 0001 0010 1111 1111
11.3 按位或| • 按位或常用于将某个运算量的某些位置1,如本例中将变量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。
11.4 按位异或^ • 参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即: 0^0==0 0^1==1 1^0==1 1^1==0 • 如:a的值为0x1234,b的值为0xff,a∧b运算的结果c应为: a 0001 0010 0011 0100 ^b 0000 0000 1111 1111 c 0001 0010 1100 1011
11.4 按位异或^ • 按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。 • 使用按位异或可以交换两个值,不用临时变量
11.4 按位异或^ 例如:x=12,y=34 x 0000 1100 ^y 0010 0010 (x) 0010 1110 x 0010 1110 ^y 0010 0010 (y) 0000 1100 x 0010 1110 ^y 0000 1100 (x) 0010 0010 例:交换两个变量的值 #include <stdio.h> main() { int x,y; printf("Enter integers x and y:\n"); scanf("%d,%d",&x,&y); x=x^y; y=x^y; x=x^y; printf(“%d, }
11.5 按位取反~ • 将参与运算量的相对应位的值取反,即1变0,0变1。 • 如:a的值为0x1234,~a运算的结果c应为: ~a 0001 0010 0011 0100 c 1110 1101 1100 1011
11.6 按位左移<< • 按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。 • 假设机器字长为8位,变量a的值为16,将a左移二位,即a=a<<2: 左移前 0001 0000 左移后 0100 0000
11.6 按位左移<< • 由此看出,左移一位相当于该数乘2,左移二位相当于乘4,即22,但这要以该数左移之后不“溢出”为前提。所谓“溢出”指该数已超过机器字长所能容纳的范围,如该例若继续左移二位,该数为16× 24=256,超出了字长8位的表示范围(257),即产生了溢出。
11.7 按位右移>> • 按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。 • 右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a>>2: 右移前 0000 1111 右移后 0000 0011
11.7 按位右移>> • 如果a是带符号的负数,a=-16,存放在机器中的补码为1111 0000,则a=a>>2,值为- 4。 右移前 1111 0000 右移后 1111 1100
运算符 名称 运算规则 & 位与 两个相应位全1为1,其余为0 | 位或 两个相应位全0为0,其余为1 ∧ 位异或 两个相应位相同为0,其余为1 ~ 取反 把操作数各位0变1,1变0 << 左移 把操作数左移指定的位数 >> 右移 把操作数右移指定的位数 位运算符的运算规则
11.8 位运算的复合赋值运算符 • 共有五种位运算的复合赋值运算符:&=(位与赋值)、|=(位或赋值) 、^= (位异或赋值) 、>>=(按位右移赋值)、<<= (按位左移赋值)。 • 例如: a ^=b 相当于a= a ^b a>>=3 相当于a= a>>3
以下程序的功能是进行位运算 main() { unsigned char a, b; a=7^3; b= ~4 & 3; printf("%d %d\n",a,b); } 程序运行后的输出结果是( A ) A)4 3 B)7 3 C)7 0 D)4 0
设有以下语句int a=1,b=2,c;c=a^(b<<2); 执行后,C的值为( D )A)6 B)7 C)8 D)9 • 若变量已正确定义,则以下语句的输出结果是( B ) s=32; s^=32; printf("%d",s);A) -1 B) 0 C) 1 D) 32