第 12章 位运算任课老师:彭金莲返回下一页上一页第 12章位运算 计算机系 彭金莲 制作本章要求
位运算的概念。
数值的原码、反码和补码。
位运算符。
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作第 12章 位运算
12.1 概述
12.2 位运算符
12.3 位运算举例
12.4 位段返回下一页上一页第 12章位运算 计算机系 彭金莲 制作
12.1 概述
c语言具有高级语言的特点,又具有低级语言的功能,用途广泛。
位运算:就是对存储单元中的二进制位进行左、右移位,按位与、或、异或、
取反等操作。
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作一、字节和位 字节( byte)
字节:内存中每一字节有一个地址,由 8
位二进制位组成,最右边为最低位,最左边为最高位。
字( word):由若干存储单元组成,一个单元存放一个数据或指令。
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作字节和位 字节( byte)
二、原码 最高位为符号位,0为正,1为负,其余各位代表数本身的绝对值。
例,+7 0 0000111
-7 1 0000111
三、反码 正数:符号位为 0,数值部分不变 负数:符号位为 1,数值部分取反。
例,+7 0 0000111
-7 1 1111000
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作
12.2 位运算符
位运算量只能是整型和字符型数据
一、按位与 &
特点:两对应位都为 1时结果为 1,否则为 0
例,3的补码,00000011
5的补码,00000101
& 00000001
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作二,按位或 |
特点:两对应位中只有一个为 1,结果便为 1,否则为 0
例,3的补码,00000011
5的补码,00000101
| 00000111
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作三、异或 ^
特点:两对应位相同,结果便为 0,否则为 1
例,3的补码,00000011
5的补码,00000101
^ 00000110
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作四,取反 ~
特点:是单目运算符,当某位原为 0 时,
经反运算后为 1,某位原为 1时,反运算后为 0;
例,3的补码,00000011
~ 11111100
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作五、左移 <<
特点:将数的二进制位全部载移若干位
例,a=a<<2 将 a的值左移两位
若,a=00001111=15 (10)
左移两位,00111100=60 (10)
由此看出,左移一位相当剩余乘 2,左移
2位相当乘 4
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作六、右移 >>
特点:将数的二进制位全部右移若干位
例,b=b >>2 将 b的值右移两位
若 b=00111000=56(10) 右移两位:
00001110=14(16)
由此可见,右移一位除 2,右移 2位相当除 4 最高位移入 0称逻辑右移,最高位移入 1称算术右移。
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作七、位运算符与赋值运算符结合可组成扩展赋值运算符
&= |= >>= <<= ^=
如,a&=b (即 a=a&b)
a<<=2(即 a=a<<2)
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作八、不同长度的数据进行位运算
如,long a; int b;
当进行,a & b 运算时,系统自动将二者按右端对齐,变量 b的左 16位补 0,
若 b为负数,左端补 16位 1,如果 b为无符号的数,则左边也补 16位 0,
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作
12.3 位运算举例
例 12.0:
main()
{ int a=13,b=12,c,d,e,f,g,h;
c=a&b; d=a|b; e=a^b; f=~a;
g=a<<2; b>2;
Printf(“a=%d,b=%d,c=%d,e=%e,
f=%d,g=%d\n”,a,b,c,d,e,f,g,h);
}
输出:
a=12,b=12,c=12,d=13,e=1,f=-14,g=52,h=3
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作例 12.1:取一整数 a从右端开始的 4 – 7位
main( )
{ unsigned a,b,c,d;
scanf(“%x”,&a);
b=a>>4; c=~(~0 <<4); d=b &c;
printf(“a[8]=%o\n d[8]=%o\nc[16]=%x\n
d[10]=%d\n”,a,d,c,d);
}
输出:
a[8]=331
d[8]=15
c[16]=f
d[10]=13
输入,331 (八进制数 )
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作例 12.3:将变量 a进行右循环移位
步骤:
① a左移 16~n位 (即右边按劳取酬 n位移到左边 )暂存中;
② a右移 n位(去掉右边 n位)暂存 c中;
③ c,b逻辑或就得到循环右移后 a的值。
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作将变量 a进行右循环移位
main()
{ unsigned a,b,c;
int n;
scanf(“a=%o,n=%d”,&a,&n);
b=a<<(16-n); c=a>>n; c=c | b;
printf(“a[8]=%0\n b[8]=%o\n
c[8]=%0\n”,a,b,c);
}
输入,a=157653,n=3
输出,a[8]=157653
b[8]=60000
c[8]=75765
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作
12.4 位段
段位:以位为单位定义长度的结构体类型中的成员
例,struct packdata
{unsigned a:2;
unsigned b:2;
unsigned c:4;
unsigned d:4;
int i; }data;
返回下一页上一页第 12章位运算 计算机系 彭金莲 制作位段的示例
main()
{ int x1,x2,x3;
data.a=3; data.b=15; data.c=13;
data.d=11; data.i=3245;
x1=data.a+data.i; x2=data.i-data.b;
x3=data.c*data.d;
printf(“data.a=%d\ndata.b=%d\n
data.c=%d,data.d=%d\ndata.i=%d\n”,
data.a,data.b,data.c,data.d data.i);
printf(“x1=%d\nx2=%d\nx3=%d\n”,x1,x2,x3);
}
输出:
data.a=3
data.b=15
data.c=13
data.d=11
data.i=3245
x1=3448
x2=3230
x3=143