21
C C 语语语 语语语 11 11 语 语语语 语 语语语 语语语语语语语 语语语语

C 语言第 11 章 位运算

  • Upload
    johnna

  • View
    140

  • Download
    11

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: C 语言第 11 章 位运算

CC 语言第语言第 1111 章 位运算章 位运算哈尔滨理工大学 计算中心

Page 2: C 语言第 11 章 位运算

Page 2CProgramming

二、八、十、十六进制换算表二、八、十、十六进制换算表十进制 二进制 八进制 十六进制0 0000 0 01 0001 1 12 0010 2 23 0011 3 34 0100 4 45 0101 5 56 0110 6 67 0111 7 78 1000 10 89 1001 11 910 1010 12 A11 1011 13 B12 1100 14 C13 1101 15 D14 1110 16 E15 1111 17 F

Page 3: C 语言第 11 章 位运算

Page 3CProgramming

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

Page 4: C 语言第 11 章 位运算

Page 4CProgramming

位运算符位运算符C 语言的位运算符有以下几个

& 按位 " 与 " | 按位 " 或 " ^ 按位 " 异或 " ~ 按位取反 << 左移 >> 右移

Page 5: C 语言第 11 章 位运算

Page 5CProgramming

位运算符说明位运算符说明位运算的对象只能是 int 或 char位运算是对每一个二进制位分别进行操作,每个字节 (byte) 是 8 个二进制位 (bit) ,以前所进行的所有变量操作均以字节为基本单位"~" 为单目运算符,其他均为双目运算符按运算符优先级顺序由高到底排列为:

~ , <<, >>, &, ^ , | << 和 >> 优先级相同

也可以使用如 "&=" 或 "|=" 等简写形式

Page 6: C 语言第 11 章 位运算

Page 6CProgramming

按位与运算(按位与运算( && ))" 与 " 运算的规则如下:

a0011

b0101

a&b0001

• 与 " 乘法 " 类似

Page 7: C 语言第 11 章 位运算

Page 7CProgramming

"" 与与 "" 运算举例运算举例unsigned int a1=077,a2=0150;printf("%o",a1&a2);

a1=0177 即二进制的 00000000 00111111a2=0177 即二进制的 00000000 01101000 &

00000000 00101000

即八进制的 050

Page 8: C 语言第 11 章 位运算

Page 8CProgramming

按位或运算按位或运算 (|)(|)" 或 " 运算的规则如下:

a0011

b0101

a|b0111

• 与 " 加法 " 类似

Page 9: C 语言第 11 章 位运算

Page 9CProgramming

"" 或或 "" 运算举例运算举例unsigned char a1=0x07,a2=0xd0;printf("%x",a1|a2);

a1=0x07 即二进制的 00000111a2=0xd0 即二进制的 11100000 |

11100111

即十六进制的 0xd7

Page 10: C 语言第 11 章 位运算

Page 10CProgramming

按位异或运算(按位异或运算( ^̂ ))" 异或 " 运算的规则如下:

a0011

b0101

a^b0110

• a , b 值相异结果为 1 ,否则结果为 0

Page 11: C 语言第 11 章 位运算

Page 11CProgramming

"" 异或异或 "" 运算举例运算举例unsigned char a1=0x20,a2=0x35;printf("%x",a1^a2);

a1=0x07 即二进制的 00100000a2=0xd0 即二进制的 00110101 ^

00010101

即十六进制的 0x15

Page 12: C 语言第 11 章 位运算

Page 12CProgramming

按位取反运算(按位取反运算( ~~ ))" 取反 " 运算的规则如下:

a01

~a10

• "1" 变成 "0" , "0" 变成 "1"

Page 13: C 语言第 11 章 位运算

Page 13CProgramming

"" 取反取反 "" 运算举例运算举例unsigned char a1=0x20;printf("%x",~a1);

a1=0x07 即二进制的 00100000 ~

11011111

即十六进制的 0xdf

Page 14: C 语言第 11 章 位运算

Page 14CProgramming

左移运算(左移运算( <<<< ))" 左移 " 运算的格式如下:

表达式 1<< 表达工 2 表达式 1 为移位的对象,表达式 2 为移位的位数 左移后,右边的空位补 "0" 左移一位相当于将操作数乘以 2

Page 15: C 语言第 11 章 位运算

Page 15CProgramming

左移运算举例左移运算举例unsigned char a1=0x12;printf("%x",a1<<3);

a1=0x07 即二进制的 00010010 <<3左移三位后变为: 00010010000

即十六进制的 0x90

舍掉 补 0

Page 16: C 语言第 11 章 位运算

Page 16CProgramming

右移运算(右移运算( >>>> ))" 右移 " 运算的格式如下:

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

Page 17: C 语言第 11 章 位运算

Page 17CProgramming

右移运算举例右移运算举例unsigned char a1=0x12;printf("%x",a1>>3);

a1=0x07 即二进制的 00010010 >>3右移三位后变为: 00000010010

即十六进制的 0x02

舍掉补 0

Page 18: C 语言第 11 章 位运算

Page 18CProgramming

位运算应用举例位运算应用举例取一整数从右端开始的 4~7 位。

07 4815

0000

右移 4 位

&00000000 11110000

00000000 0000

Page 19: C 语言第 11 章 位运算

Page 19CProgramming

位运算应用举例位运算应用举例 -- 续续低 4 位为 1 ,其余为 0 的数:

00000000 000000000

11111111 11111111~0

~0<<4 11111111 00001111

00000000 11110000~(~0<<4)

整个程序的表达式为 : (a>>4)&(~(~0<<4))

Page 20: C 语言第 11 章 位运算

Page 20CProgramming

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

Page 21: C 语言第 11 章 位运算

Page 21CProgramming

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