《第10章位运算》由会员分享,可在线阅读,更多相关《第10章位运算(29页珍藏版)》请在金锄头文库上搜索。
1、Wenzhou University Wenzhou University 1The C Programming LanguageThe C Programming Language程序设计基础程序设计基础程序设计基础程序设计基础 The C Programming LanguageWenzhou University Wenzhou University 2The C Programming LanguageThe C Programming Language本章要点本章要点位运算的种类位运算的种类各种位运算的规则各种位运算的规则Wenzhou University Wenzhou Univ
2、ersity 3The C Programming LanguageThe C Programming Language位运算位运算C语言与其他高级语言相比较,一个比较语言与其他高级语言相比较,一个比较有特色的地方就是位运算,利用位运算可有特色的地方就是位运算,利用位运算可以实现许多汇编语言才能实现的功能。以实现许多汇编语言才能实现的功能。Wenzhou University Wenzhou University 4The C Programming LanguageThe C Programming Language一、实例导入一、实例导入Wenzhou University Wenzhou
3、 University 5The C Programming LanguageThe C Programming Language例例10.1 统计统计x中值为中值为1的二进制位的个数。的二进制位的个数。 输入样例:输入样例:15输出样例:输出样例:4Wenzhou University Wenzhou University 6The C Programming LanguageThe C Programming Languageint bitcount(unsigned x)int b=0;while(x)if(x & 01)b+;x=1;/*x右移一位右移一位*/return b;Wenz
4、hou University Wenzhou University 7The C Programming LanguageThe C Programming Language#include int main()int n;scanf(%d, &n);printf(%dn, bitcount(n);return 0;Wenzhou University Wenzhou University 8The C Programming LanguageThe C Programming Language说明:说明:这里将这里将x声明为无符号类型是为了保证将声明为无符号类型是为了保证将x右移时,无论该程
5、序在什么机器上运行,右移时,无论该程序在什么机器上运行,左边空出的位都用左边空出的位都用0(而不是符号位)填补。(而不是符号位)填补。 Wenzhou University Wenzhou University 9The C Programming LanguageThe C Programming Language二、位运算符二、位运算符C语言提供了语言提供了6个位操作运算符。这些运算个位操作运算符。这些运算符只能作用于带符号或无符号的符只能作用于带符号或无符号的char、short、int与与long类型。类型。&按位与按位与|按位或按位或按位异或按位异或右移右移按位求反按位求反Wenzh
6、ou University Wenzhou University 10The C Programming LanguageThe C Programming Language注意:注意:位运算符位运算符&、| 同逻辑运算符同逻辑运算符 &、| 的区的区别,后者用于从左至右求表达式的真值。别,后者用于从左至右求表达式的真值。例如,如果例如,如果x的值为的值为1,y的值为的值为2,那么,那么,x&y的结果为的结果为0,而,而x&y的值为的值为1。 Wenzhou University Wenzhou University 11The C Programming LanguageThe C Prog
7、ramming Language1、“按位与按位与”运算符运算符 (&) 00001001 (9 的二进制补码的二进制补码)&00000101 (5 的二进制补码的二进制补码) 00000001 (1 的二进制补码的二进制补码)按位与运算符按位与运算符“&”是双目运算符。其功能是参与运是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进算的两数各对应的二进位相与。只有对应的两个二进位均为位均为1 时,结果位才为时,结果位才为1,否则为,否则为0。参与运算的数参与运算的数以补码方式出现以补码方式出现。例如:例如:9&5 可写算式如下:可写算式如下: 按位与运算符按位与运算符
8、“&”经常用于屏蔽某些二进制位。经常用于屏蔽某些二进制位。Wenzhou University Wenzhou University 12The C Programming LanguageThe C Programming Language2、“按位或按位或”运算符运算符(|) 00110000| 00001111 00111111 按位或运算符按位或运算符“|”是双目运算符。其功能是参与运算的是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个两数各对应的二进位相或。只要对应的两个二进位有一个为为1 时,结果位就为时,结果位就为1。即。即0|0=0,0|1=1
9、,1|0=1,1|1=1。参与运算的两个数均以补码出现。参与运算的两个数均以补码出现。)例如,想使一个数例如,想使一个数a的低的低4位改为位改为1,只需将,只需将a与与017进行按进行按位或运算即可。例如,位或运算即可。例如,060|017,将八进制数,将八进制数60与八进制与八进制数数17进行按位或运算,算式如下:进行按位或运算,算式如下:按位或运算符按位或运算符“|”常用于将某些二进制位置为常用于将某些二进制位置为1。Wenzhou University Wenzhou University 13The C Programming LanguageThe C Programming Lan
10、guage3、“按位异或按位异或”运算符运算符() 00111001 00101010 00010011 按位异或运算符按位异或运算符“”是双目运算符,也是双目运算符,也称称XOR运算符。其功能是参与运算的两运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二数各对应的二进位相异或,当两对应的二进位进位相异相异时,结果为时,结果为1。参与运算数仍以。参与运算数仍以补码出现。补码出现。例:例:071052=023 (八进制数)(八进制数)Wenzhou University Wenzhou University 14The C Programming LanguageThe C Pr
11、ogramming Language一元运算符一元运算符用于求用于求整数整数的二进制反码,即分的二进制反码,即分别将操作数各二进制位上的别将操作数各二进制位上的1变为变为0,0变为变为1。例如:例如:x=x&077把把x的最后的最后6位设置为位设置为0。注意:表达式注意:表达式x&077与机器字长无关,它比与机器字长无关,它比形式为形式为x&0177700的表达式要好,因为后者的表达式要好,因为后者假定假定x是是16位的数值。这种可移植的形式并没位的数值。这种可移植的形式并没有增加额外开销,因为有增加额外开销,因为077是常量表达式,是常量表达式,可以在编译时求值。可以在编译时求值。4、“按位
12、取反按位取反”运算符()运算符()Wenzhou University Wenzhou University 15The C Programming LanguageThe C Programming Language5、移位运算符(、移位运算符()移位运算符移位运算符分别用于将运算的左操作分别用于将运算的左操作数左移与右移,移动的位数则由操作数指定数左移与右移,移动的位数则由操作数指定(右操作数的值必须是非负值)。(右操作数的值必须是非负值)。在对在对unsigned类型的无符号值进行右移位时,类型的无符号值进行右移位时,左边空出的部分将用左边空出的部分将用0填补;当对填补;当对signed
13、类型类型的带符号值进行右移时,某些机器将对左边的带符号值进行右移时,某些机器将对左边空出的部分用空出的部分用符号位符号位填补(即填补(即“算术移位算术移位”),而另一些机器则对左边空出的部分用),而另一些机器则对左边空出的部分用0填补(即填补(即“逻辑移位逻辑移位”)。)。Wenzhou University Wenzhou University 16The C Programming LanguageThe C Programming Language例如:例如:若若a是整型变量,表达式是整型变量,表达式 (a a ) 的值是的值是0;表达式;表达式 (101 5) 的值是的值是0;表达;表
14、达式式255 & 128的值是的值是128。Wenzhou University Wenzhou University 17The C Programming LanguageThe C Programming Language例例10.2编写函数编写函数getbits(x, p, n),它返回,它返回x中从右中从右边数第边数第p位开始向右数位开始向右数n位的字段。这里位的字段。这里假定最右边的一位是第假定最右边的一位是第0位,位,n与与p都是合都是合理的正值。例如,理的正值。例如,getbits(x, 4, 3)返回返回x中中第第4、3、2三位的值。三位的值。unsigned getbits
15、(unsigned x, int p, int n) return (x (p n + 1) & (0 (p n + 1)将期望获得的将期望获得的字段移位到字的最右端;字段移位到字的最右端;(2)0的所有位都为的所有位都为1,这里使用语句,这里使用语句 0 n 将将0左移左移n位,并将最右边的位,并将最右边的n位位用用0填补。再使用填补。再使用运算对它按位取反,这运算对它按位取反,这样就建立了最右边样就建立了最右边n位全为位全为1的屏蔽码。的屏蔽码。Wenzhou University Wenzhou University 19The C Programming LanguageThe C P
16、rogramming Language三、位字段三、位字段有些信息在存储时,并不需要占用一个完有些信息在存储时,并不需要占用一个完整的字节,整的字节, 而只需占一个或几个二进制而只需占一个或几个二进制位。例如,在存放一个开关量时,只有位。例如,在存放一个开关量时,只有0和和1 两种状态,用一位二进位即可。为了两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,语言又节省存储空间,并使处理简便,语言又提供了一种数据结构,称为提供了一种数据结构,称为“位字段位字段”。Wenzhou University Wenzhou University 20The C Programming Lang
17、uageThe C Programming Language位字段位字段位字段(位字段(bit-field),或简称),或简称字段字段,是,是“字字”中相邻位的中相邻位的集合。集合。“字字”(word)是单个的存储单元,它同具体的)是单个的存储单元,它同具体的实现有关。例如:实现有关。例如:structunsigned int is_keyword: 1;unsigned int is_extern: 1;unsigned int is_static: 1;flags;这里定义了一个变量这里定义了一个变量flags,它包含,它包含3个个1位的字段。冒号后位的字段。冒号后的数字表示字段的宽度(用
18、二进制位数表示)。字段被声的数字表示字段的宽度(用二进制位数表示)。字段被声明为明为unsigned int类型,以保证它们是无符号量。类型,以保证它们是无符号量。Wenzhou University Wenzhou University 21The C Programming LanguageThe C Programming Language位字段位字段字段的所有属性几乎都同具体的实现有关。字段是否能覆盖字字段的所有属性几乎都同具体的实现有关。字段是否能覆盖字边界由具体的实现定义。字段可以不命名,无名字段(只有一边界由具体的实现定义。字段可以不命名,无名字段(只有一个冒号和宽度)起填充作用
19、,特殊宽度个冒号和宽度)起填充作用,特殊宽度0可以用来强制在下一可以用来强制在下一个字边界上对齐。例如:个字边界上对齐。例如:struct bsunsigned a: 4unsigned : 0unsigned b: 4 /*从下一单元开始存放从下一单元开始存放*/unsigned c: 4;在这个位域定义中,在这个位域定义中,a 占第一字节的占第一字节的4 位,后位,后4 位填位填0 表示表示不使用,不使用,b 从第二字节开始,占用从第二字节开始,占用4 位,位,c 占用占用4 位。位。 Wenzhou University Wenzhou University 22The C Progra
20、mming LanguageThe C Programming Language位字段位字段某些机器上字段的分配是从字的左端至右某些机器上字段的分配是从字的左端至右端进行的,而某些机器上则相反。端进行的,而某些机器上则相反。单个字段的引用方式与其他结构成员相同。单个字段的引用方式与其他结构成员相同。字段的作用与小整数相似,同其他整数一字段的作用与小整数相似,同其他整数一样,字段可出现在算术表达式中。样,字段可出现在算术表达式中。字段不是数组,它没有地址,因此对它们字段不是数组,它没有地址,因此对它们不能使用不能使用&运算符。运算符。Wenzhou University Wenzhou Univ
21、ersity 23The C Programming LanguageThe C Programming Language#includeint main()struct bsunsigned a:1;unsigned b:3;unsigned c:4;bit, *pbit;bit.a=1;bit.b=7;bit.c=25;printf(%d,%d,%dn, bit.a, bit.b, bit.c);pbit=&bit;pbit-a=0;pbit-b&=3;pbit-c|=1;printf(%d,%d,%dn,pbit-a,pbit-b,pbit-c);return 0;例例10.3 写出下列
22、程序的运行结果。写出下列程序的运行结果。Wenzhou University Wenzhou University 24The C Programming LanguageThe C Programming LanguageWenzhou University Wenzhou University 25The C Programming LanguageThe C Programming Language本章小结本章小结Wenzhou University Wenzhou University 26The C Programming LanguageThe C Programming Lang
23、uage参考书目参考书目http:/cm.bell- University Wenzhou University 27The C Programming LanguageThe C Programming Language网络资源网络资源http:/ (罗朝盛个人网站)(罗朝盛个人网站)http:/cpp.ga- (蚂蚁的(蚂蚁的C/C+标准编程标准编程 )http:/ (浙大精品课程浙大精品课程)http:/www.sandroid.org/TurboC/http:/ (History)http:/ University Wenzhou University 28The C Programming LanguageThe C Programming Language讨讨 论论 时时 间间Wenzhou University Wenzhou University 29The C Programming LanguageThe C Programming Language