1、C语言第11章 位运算,哈尔滨理工大学 计算中心,Page 2,二、八、十、十六进制换算表,Page 3,位运算,计算机中的信息是以二进制0、1存储的 每个0或1称为一个“位“(bit) 在C语言中提供了对二进制位(bit)的直接操作,使C具有了某些汇编语言才有的功能,Page 4,位运算符,C语言的位运算符有以下几个 & 按位“与“ | 按位“或“ 按位“异或“ 按位取反 右移,Page 5,位运算符说明,位运算的对象只能是int或char 位运算是对每一个二进制位分别进行操作,每个字节(byte)是8个二进制位(bit),以前所进行的所有变量操作均以字节为基本单位 “为单目运算符,其他均为
2、双目运算符 按运算符优先级顺序由高到底排列为: , , &, , | 优先级相同 也可以使用如“&=“或“|=“等简写形式,Page 6,按位与运算(&),“与“运算的规则如下:,a 0 0 1 1,b 0 1 0 1,a&b 0 0 0 1,与“乘法“类似,Page 7,“与“运算举例,unsigned int a1=077,a2=0150; printf(“%o“,a1,a1=0177即二进制的00000000 00111111 a2=0177即二进制的00000000 01101000 &,00000000 00101000,即八进制的050,Page 8,按位或运算(|),“或“运算的
3、规则如下:,a 0 0 1 1,b 0 1 0 1,a|b 0 1 1 1,与“加法“类似,Page 9,“或“运算举例,unsigned char a1=0x07,a2=0xd0; printf(“%x“,a1|a2);,a1=0x07即二进制的 00000111 a2=0xd0即二进制的 11100000 |,11100111,即十六进制的0xd7,Page 10,按位异或运算(),“异或“运算的规则如下:,a 0 0 1 1,b 0 1 0 1,ab 0 1 1 0,a,b值相异结果为1,否则结果为0,Page 11,“异或“运算举例,unsigned char a1=0x20,a2=0
4、x35; printf(“%x“,a1a2);,a1=0x07即二进制的 00100000 a2=0xd0即二进制的 00110101 ,00010101,即十六进制的0x15,Page 12,按位取反运算(),“取反“运算的规则如下:,a 0 1,a 1 0,“1“变成“0“,“0“变成“1“,Page 13,“取反“运算举例,unsigned char a1=0x20; printf(“%x“,a1);,a1=0x07即二进制的 00100000 ,11011111,即十六进制的0xdf,Page 14,左移运算(),“左移“运算的格式如下: 表达式1表达工2 表达式1为移位的对象,表达式
5、2为移位的位数 左移后,右边的空位补“0“ 左移一位相当于将操作数乘以2,Page 15,左移运算举例,unsigned char a1=0x12; printf(“%x“,a13);,a1=0x07即二进制的 00010010 3 左移三位后变为: 00010010000,即十六进制的0x90,舍掉,补0,Page 16,右移运算(),“右移“运算的格式如下: 表达式1表达工2 表达式1为移位的对象,表达式2为移位的位数 对于无符号数,右移后,左边的空位补“0” 对于带符号数,若符号位为0,右移后,左边的空位补“0”;若符号位为1,右移后,左边的空位补“0”或补“1”随计算机系统不同,补“0
6、”的称为逻辑右移,补“1”的称为算术右移,Page 17,右移运算举例,unsigned char a1=0x12; printf(“%x“,a13);,a1=0x07即二进制的 00010010 3 右移三位后变为: 00000010010,即十六进制的0x02,舍掉,补0,Page 18,位运算应用举例,取一整数从右端开始的47位。,&,Page 19,位运算应用举例-续,低4 位为1,其余为0的数:,整个程序的表达式为: (a4)&(04),Page 20,位域(bit field),C语言允许在一个结构体中以位为单位来指定其成员所占内存的长度,称为位域(bit field) 例: st
7、ruct packed _data unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i; data; 此时,变量data的各个成员中,a,b,c,d分别占2位、6位、4位、4位,i占16位,整个data占的空间为4bytes 当位域成员所占空间不足一个字节时,系统自动将空余部分闲置不用,Page 21,位域说明,位域成员的类型只能为unsigned 或int 在存储单元中,位域的分配方式因机器而异,可不关心 位域可当做整型变量使用,但要注意位域表示数值的范围,如两位二进制的范围为03,三位二进制的范围为07 不能定义位域数组 位域可按整型量的形式加参运算或赋值、输出,