内容正文:
第12章 位运算
12.1 位运算符
运算符 含义 示例 运算功能
& 按位与 a&b 若a与b相应位都为1,该位结果为1
| 按位或 a|b 若a与b相应位都为0,该位结果为0
^ 按位异或 A^b 若a与b相应位相同,该位结果为0
~ 取反 ~a 若a的相应位为1,该位结果为0
<< 左移 a<<2 将a的二进制数左移2位,右补0
>> 右移 a>>2 将a的二进制数右移2位,左补0或1
12.2 位运算符的功能
12.2.1 按位与运算(&)
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1
例如: 已知a=0x1234, b=0x00ff
求 c=a&b
a 0001 0010 0011 0100
& b 0000 0000 1111 1111
c 0000 0000 0011 0100
12.2.2、 按位或运算(|)
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1
例如: 已知a=0x1234, b=0x00ff
求 c=a|b
a 0001 0010 0011 0100
| b 0000 0000 1111 1111
c 0001 0010 1111 1111
12.2.3 按位异或运算(^)或
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0
例如: 已知a=0x1234, b=0x00ff
求 c=a^b
a 0001 0010 0011 0100
^ b 0000 0000 1111 1111
c 0001 0010 1100 1011
12.2.4 按位取反运算(~)
运算规则:~0=1; ~1=0
例如: 已知a=0x1234
求 c= ~a
~ a 0001 0010 0011 0100
c 1110 1101 1100 1011
12.2.5 按位左移(<<)
公式: a=a<<n
运算规则:将a各位左移n位,低位补零,进位舍弃
例如: 假设机器字长为8位, 已知a=16
求 a=a<<2
a=0001 0000<<2=0100 0000=64
12.2.6 按位右移(>>)
公式: a=a>>n
运算规则:将a各位右移n位,低位移出,
高位补零(无符号数)或按符号位补齐
例如: 假设机器字长为8位, 已知a=16,b=-16
求 a=a>>2; b=b>>2
a=0001 0000>>2=0000 0100=4
b=1111 0000(补码)>>2=1111 1100=4(补码)
12.2.7复合位赋值运算符
&=; |=; ^=; ~=; <<=; >>=
优先级: 仅高于逗号运算符
结合性: 自右向左
例如: a&=b 相当于: a=a&b
a|=b 相当于: a=a|b
8、举例
取一个整数a从右端开始的5~8位
分析:(1)将a右移5位, b=a>>5
(2)设置一个低四位为1,其余位为0的数, c=~(~0<<4)
(3)将b和c进行&运算, d=b&c
程序如下:
main()
{ unsigned a,b,c,d;
scanf(“%o”,&a);
b=a>>5;
c=~(~0<<4);
d=b&c;
printf(“%o
%o
”,a,d);
}
back
语句:printf(“%d
”,12&012) ;的输出结果是( )。
A. 12 B. 8 C. 6 D. 012
2. 以下程序的输出结果是( )。
main()
{ int x=0.5; char z='a';
printf("%d
", (x&1)&&(z<'z') ); }
A. 0 B. 1 C. 2 D. 3
$