文档介绍:第12章位运算
1
1 位运算符和位运算
2 位运算举例
3 位段
位运算
2
位运算符和位运算
3
位运算
位运算符和位运算
所谓位运算是指进行二进制位的运算。
C语言提供下列位运算符:
位运算符中除~ 外,均为二目(元)运算符。
运算量只能是整型或字符型的数据,不能为实型数据。
运算符
含义
运算符
含义
&
按位与
~
取反
|
按位或
<<
左移
^
按位异或
>>
右移
4
位运算
位运算符和位运算
"按位与"运算符(&):
参加运算的两个数据,按二进位进行"与"运算。
0&0=0; 0&1=0; 1&0=0; 1&1=1
"按位或"运算符(|):
参加运算的两个数据,按二进位进行"或"运算。
0|0=0; 0|1=1; 1|0=1; 1|1=1
"异或"运算符(^、XOR):
"异或"的意思是判断两个相应的位值是否为"异"(值不同),为"异"就取真(1),否则为假(0)。
0^0=0; 0^1=1; 1^0=1; 1^1=0
"取反"运算符(~):
单目(元)运算符,用来对一个二进制数按位取反。
~0=1; ~1=0
~的优先级高于算术、关系、逻辑及其他位运算符。
5
位运算
位运算符和位运算
"左移"运算符(<<):
用来将一个数的各二进位全部左移若干位。
高位左移后溢出,舍弃不起作用。
左移1位相当于该数乘以2,左移n位相当于该数乘以2n;但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
"右移"运算符(>>):
用来将一个数的各二进位全部右移若干位。
右移1位相当于该数除以2,右移n位相当于该数除以2n。
移到右端的低位被舍弃;对无符号数,高位补0;对于有符号数,如果原来符号位为0,则左边也是移入0,如果符号位原来为1,则左边移入0("逻辑右移")还是移入1("算术右移"),要取决于所用的计算机系统。
Turbo C采用的是算术位移。
6
位运算
位运算符和位运算
位运算赋值运算符:
位运算与赋值运算符可以组成复合赋值运算符。
&=,|=,^=,<<=,>>=
不同长度的数据进行位运算:
如果两个数据长度不同,进行位运算时,系统会将二者按右端对齐。
如a&b,a为long型,b为int型。
若b为正数,则左侧16位补满0;
若b为负数,则左侧16位补满1;
若b为无符号整数型,则左侧16位补满0。
7
位运算举例
8
位运算
位运算举例
例:取一个整数a 从右端开始的4~7位。
先使a 右移4位:a>>4
设置一个低4位全为1,其余全为0的数:~(~0<<4)
将上面二者进行&运算,即:(a>>4)& ~(~0<<4)
#include ""
main( ) {
unsigned a, b, c, d;
scanf("%o", &a);
b = a>>4;
c = ~(~0<<4);
d = b&c;
printf("%o, %d\n", a, a);
printf("%o, %d\n", d, d);
}
可以任意指定从右边第m位开始取其右面n位,只需改为: b = a>>( m-n+1) ; c = ~(~0<<n);
9
位运算
位运算举例
例:循环移位。将整数a 进行右循环移位。
将a 的右端n 位先放到b 中的高n 位中:b=a<<(16-n)
将a 右移n 位,其左面高位n 位补0:c=a>>n
将上面二者c与b进行按位或运算即:c=c|b
#include ""
main( ) {
unsigned a, b, c;
int n;
scanf("a=%o,", &a);
scanf("n=%d", &n);
b = a<<(16-n);
c = a>>n;
c = c | b;
printf("%o\n", a);
printf("%o", c);
}
b = a>>( 16-n) ; //左循环
c = a<<n; // 移位
10