1 / 21

C 语言第 11 章 位运算

C 语言第 11 章 位运算. 哈尔滨理工大学 计算中心. 二、八、十、十六进制换算表. 位运算. 计算机中的信息是以二进制 0 、 1 存储的 每个 0 或 1 称为一个 " 位 " ( bit ) 在 C 语言中提供了对二进制位( bit )的直接操作,使 C 具有了某些汇编语言才有的功能. 位运算符. C 语言的位运算符有以下几个 & 按位 " 与 " | 按位 " 或 " ^ 按位 " 异或 " ~ 按位取反 << 左移 >> 右移. 位运算符说明. 位运算的对象只能是 int 或 char

johnna
Télécharger la présentation

C 语言第 11 章 位运算

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C语言第11章 位运算 哈尔滨理工大学 计算中心

  2. 二、八、十、十六进制换算表

  3. 位运算 • 计算机中的信息是以二进制0、1存储的 • 每个0或1称为一个"位"(bit) • 在C语言中提供了对二进制位(bit)的直接操作,使C具有了某些汇编语言才有的功能

  4. 位运算符 • C语言的位运算符有以下几个 • & 按位"与" • | 按位"或" • ^ 按位"异或" • ~ 按位取反 • << 左移 • >> 右移

  5. 位运算符说明 • 位运算的对象只能是int或char • 位运算是对每一个二进制位分别进行操作,每个字节(byte)是8个二进制位(bit),以前所进行的所有变量操作均以字节为基本单位 • "~"为单目运算符,其他均为双目运算符 • 按运算符优先级顺序由高到底排列为: • ~ , <<, >>, &, ^ , | • <<和>>优先级相同 • 也可以使用如"&="或"|="等简写形式

  6. 按位与运算(&) • "与"运算的规则如下: a 0 0 1 1 b 0 1 0 1 a&b 0 0 0 1 • 与"乘法"类似

  7. "与"运算举例 • unsigned int a1=077,a2=0150; • printf("%o",a1&a2); a1=0177即二进制的00000000 00111111 a2=0177即二进制的00000000 01101000 & 00000000 00101000 即八进制的050

  8. 按位或运算(|) • "或"运算的规则如下: a 0 0 1 1 b 0 1 0 1 a|b 0 1 1 1 • 与"加法"类似

  9. "或"运算举例 • unsigned char a1=0x07,a2=0xd0; • printf("%x",a1|a2); a1=0x07即二进制的 00000111 a2=0xd0即二进制的 11100000 | 11100111 即十六进制的0xd7

  10. 按位异或运算(^) • "异或"运算的规则如下: a 0 0 1 1 b 0 1 0 1 a^b 0 1 1 0 • a,b值相异结果为1,否则结果为0

  11. "异或"运算举例 • unsigned char a1=0x20,a2=0x35; • printf("%x",a1^a2); a1=0x07即二进制的 00100000 a2=0xd0即二进制的 00110101 ^ 00010101 即十六进制的0x15

  12. 按位取反运算(~) • "取反"运算的规则如下: a 0 1 ~a 1 0 • "1"变成"0","0"变成"1"

  13. "取反"运算举例 • unsigned char a1=0x20; • printf("%x",~a1); a1=0x07即二进制的 00100000 ~ 11011111 即十六进制的0xdf

  14. 左移运算(<<) • "左移"运算的格式如下: • 表达式1<<表达工2 • 表达式1为移位的对象,表达式2为移位的位数 • 左移后,右边的空位补"0" • 左移一位相当于将操作数乘以2

  15. 左移运算举例 • unsigned char a1=0x12; • printf("%x",a1<<3); a1=0x07即二进制的 00010010 <<3 左移三位后变为: 00010010000 舍掉 补0 即十六进制的0x90

  16. 右移运算(>>) • "右移"运算的格式如下: • 表达式1>>表达工2 • 表达式1为移位的对象,表达式2为移位的位数 • 对于无符号数,右移后,左边的空位补“0” • 对于带符号数,若符号位为0,右移后,左边的空位补“0”;若符号位为1,右移后,左边的空位补“0”或补“1”随计算机系统不同,补“0”的称为逻辑右移,补“1”的称为算术右移

  17. 右移运算举例 • unsigned char a1=0x12; • printf("%x",a1>>3); a1=0x07即二进制的 00010010 >>3 右移三位后变为: 00000010010 舍掉 补0 即十六进制的0x02

  18. 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位。 &

  19. 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))

  20. 位域(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 • 当位域成员所占空间不足一个字节时,系统自动将空余部分闲置不用

  21. 位域说明 • 位域成员的类型只能为unsigned 或int • 在存储单元中,位域的分配方式因机器而异,可不关心 • 位域可当做整型变量使用,但要注意位域表示数值的范围,如两位二进制的范围为0~3,三位二进制的范围为0~7 • 不能定义位域数组 • 位域可按整型量的形式加参运算或赋值、输出

More Related