《C语言程序设计》 课件 第10章 位运算_第1页
《C语言程序设计》 课件 第10章 位运算_第2页
《C语言程序设计》 课件 第10章 位运算_第3页
《C语言程序设计》 课件 第10章 位运算_第4页
《C语言程序设计》 课件 第10章 位运算_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章位运算信息工程学院主讲人:XXX内容提要41位运算符和位运算12位运算举例423位段4242524410.1位运算符和位运算运算符含义运算符含义&按位与~取反|按位或<<左移^按位异或>>右移C语言提供如表10-1所列出来的位运算符。说明:(1)位运算中除取反(~)以外,其它均为二目(元)运算符,即要求运算符的两侧各有一个操作数。(2)参与位运算的运算量只能是整型或字符型数据,不能为浮点型数据。说明:(1)位运算中除取反(~)以外,其它均为二目(元)运算符,即要求运算符的两侧各有一个操作数。(2)参与位运算的运算量只能是整型或字符型数据,不能为浮点型数据。10.1位运算符和位运算10.1.1“按位与”运算符(&)参加运算的两个数据,按二进制位展开一一进行对应位“与”运算。与运算的法则:如果两个二进制位都为1,则该位运算的结果值为1;否则运算的值为0。即:0&0=0,0&1=0,1&0=0,1&1=1例如,3&6并不等于9,应该是按位与:00000011(3)

(&)00000110(6)00000010(2)因些,3&6的值得2。如果参加与运算的是负数(如-3&-6),则以补码形式表示为二进制数,然后按位进行“与”运算。10.1位运算符和位运算10.1.2“按位或”运算符(|)参加运算的两个数据,按二进制位一一进行“或”运算。或运算的法则:如果两个二进制位都为0,则该位运算的结果值为0;否则运算的值为1。即:0|0=0,0|1=1,1|0=1,1|1=1。例如:062|017将八进制数62与八进制数17进行按位或运算。00110010

(|)0000111100111111低4位全为1。如果想使一个数a的低4位为1,只需要将a与017进行按位或运算就可以了。按位或(|)运算常用来对一个数据的某些位设定为1。例如,a是一个整数(16位),有表达式:a|0377则低8位的值全置为1,高8位保留原来的值。10.1位运算符和位运算10.1.3“异或”运算符(^)异或(^)运算符也称XOR运算符。参加运算的两个数据,按二进制位一一进行“异或”运算。异或运算的法则:如果两个二进制位同号,则结果值为0(假);异号则为1(真)。即:0^0=0,0^1=1,1^0=1,1^1=0。例如:071^05200111001(十进制数57,八进制数071)

(^)00101010

(十进制数42,八进制数052)00010011(十进制数19,八进制数023)结果为023(八进制数)。“异或”是判断两个相应的位值是否为“异”,为“异”(值不同)就取真(1);否则为假(0)。10.1位运算符和位运算10.1.4“取反”运算符(~)取反(~)是一个单目运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。例如:~24是对八进制数024(即二进制数00010100)按位取反。0000000000010100

(~)

1111111111101011即八进制数177753。因此,~024的值为八进制数177753。不要误认为~025的值是─025。10.1位运算符和位运算10.1.5左移运算符(<<)用来将一个数的各个二进制位全部左移若干位。例如:a=a<<2将a的二进制位左移2位,右补0。若a=14,即二进制数00001110,左移2位得00111000,即十进制数56(为了简单用8位二进制数表示十进制数14,如果用16位二进制数表示结果是一样的)。高位左移后溢出,舍弃。左移1位相当于该数乘以2,左移2位相当于该数乘以22=4。上面举的例子14<<2=56,即乘以4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。例如,假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0,而左移2位时,溢出的高位中包含了1。10.1位运算符和位运算10.1.6右移运算符(>>)

a>>2表示将a的各二进制位右移2位,移出右端的低位被舍弃,对无符号数高位补0。例如,a=15时:a的值用二进制形式表示为00001111,a>>2为00000011(11),其中括号中的2位舍弃。右移一位相当于除以2,右移n位相当于除以2n。在右移时,需要注意符号位的问题。对于无符号数,右移时左边高位移入0,对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0,如同上例所示的那样,如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑右移”,即简单右移;移入1的称为“算术右移”。例如,a的值为八进制数0113755:a:1001011111101101(用二进制数表示)a>>1:0100101111110110(逻辑右移时)a>>1:1100101111110110(算术右移时)10.1位运算符和位运算10.1.7位运算符与赋值运算符组合位运算符与赋值运算符可以组成复合赋值运算符,例如:&=,|=,>>=,<<=,^=等。例如,a|=b相当于a=a|b,a>>=2相当于a=a>>2。10.1.8不同长度的数据进行位运算如果两个数据长度不同(例如long型和int型)进行位运算时(如a&b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧位补满0;若b为负数,左端应补满1;如果b为无符号整数型,则左侧添满0。10.2位运算举例【例10.1】取一个整数a从右端开始的4~7位。可以这样考虑:1先使a向右移4位,目的是使要取出的那几位移到最右端。其中图10-3是未移之前的,图10-4是移4位后的情况。程序如下:#include<stdio.h>voidmain(){unsigneda,b,c,d;scanf("%o",&a);b=a>>4;c=~(~0<<4);d=b&c;printf("%o,%d\n%o,%d\n",a,a,d,d);}运行结果:位运算举例10.3位段关于位段的定义和引用,说明如下:1、位段成员的类型必须指定为int或unsigned类型。2、若某一位段要从另一个字开始存放,可以用如下形式定义:unsigneda:1;unsignedb:2;unsigned:0;unsignedc:3;本来a、b、c应连续存放在一个存储单元(字)中,中间用了长度为0的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,会将a、b放在一个存储单元中,c另放在下一个单元中(存储单元根据不同的编译系统可能是一个字节,也可能是两个字节)。3、一个位段必段存储在一个存储单元中,如果一个存储单元的空间不能容纳下一个位段,则该空间不用,而从下一个存储单元起存放该位段。10.3位段关于位段的定义和引用,说明如下:4、可以定义无名位段。例如:unsigneda:1;unsigned:2;(这两位空间不用)unsignedb:3;unsignedc:4;在a后面是无名位段,该空间不用。5、位段的长度不能大于存储单元的长度,也不能定义位段数组。6、用位段可以用整型输出。例如:printf(”%d%d%d”,data.a,data.b,data.c);位段也可以用%u、%o、%x等格式输出。7、位段也可以在数值表达式中引用,系统会自动将其转换成整型数。例如:data.a+5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论