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