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