第12章_C语言位运算

上传人:沈*** 文档编号:244062200 上传时间:2024-10-02 格式:PPT 页数:35 大小:482.50KB
返回 下载 相关 举报
第12章_C语言位运算_第1页
第1页 / 共35页
第12章_C语言位运算_第2页
第2页 / 共35页
第12章_C语言位运算_第3页
第3页 / 共35页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第十二章,位运算,1,主要内容,12.1,位运算符和位运算,12.2,位运算举例,12.3,位段,2,概念,位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。,例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。,语言提供位运算的功能,与其他高级语言(如,PASCAL,)相比,具有很大的优越性。,3,12.1,位运算符和位运算,运算符 含义 运算符 含义,按位与,取反,|,按位或,右移,(1),位运算符中除以外,均为二目(元)运算符,即要求两侧各有一个运算量。,(2),运算量只能是整型或字符型的数据,不能为实型数据。,语言提供的位运算符有:,说明:,4,12.1.1“,按位与”运算符(),按位与是指:,参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。即:,,,例:,并不等于,应该是按位与运算:,注意:,如果参加,&,运算的是负数(如,-3&-5,),则要以补码形式表示为二进制数,然后再按位进行,“,与,”,运算。,00000011,(3),&,00000101,(5),00000001,(1),3&5,的值得,5,按位与的用途:,若想对一个存储单元清零,即使其全部二进制位为,只要找一个二进制数,其中各个位符合以下条件:,原来的数中为的位,新数中相应位为。,然后使二者进行运算,即可达到清零目的。,(1),清零,例:,原有数为,另找一个数,设它为,这样在原数为的位置上,该数的相应位值均为。将这两个数进行运算:,00101011,&,10010100,00000000,6,(2),取一个数中某些指定位,如有一个整数(个字节),想要取其中的低字节,只需将与,8,个,1,按位与即可。,0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0,a,b,c,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1,0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0,7,(3),保留一位的方法:与一个数进行运算,此数在该位取。,即:,a=84,b=59,c=,a&b,=16,例:,有一数,想把其中左面第、位保留下来,运算如下:,01010100,(84),&,00111011,(59),00010000,(16),8,12.1.2“,按位或”运算符(,|,),两个相应的二进制位中只要有一个为,该位的结果值为。,即,|,,,|,,,|,,,|,例:,060|017,将八进制数,60,与八进制数,17,进行按位或运算。,00110000,|,00001111,00111111,9,应用:,按位或运算常用来对一个数据的某些位定值为。例如:如果想使一个数的低位改为,只需将与进行按位或运算即可。,例:,是一个整数(位),有表达式:,|,则低位全置为,高位保留原样。,10,12.1.3“,异或”运算符(,),异或运算符,也称,XOR,运算符。它的规则是:,若参加运算的两个二进制位,同号则结果为(假),异号则结果为(真),即,:00=0,,,01=1,,,10=1,,,11=0,即,:071052=023,(八进制数),00111001,00101010,00010011,例:,11,()使特定位翻转,设有,想使其低位翻转,即变为,变为。可以将它与进行,运算,即:,运算符应用:,01111010,00001111,01110101,运算结果的低位正好是原数低位的翻转。可见,要使哪几位翻转就将与其进行,运算的该几位置为即可。,12,因为原数中的与进行,运算得,,得,故保留原数,。,例如:,012,00=012,()与相,,保留原值,00001010,00000000,00001010,13,()交换两个值,不用临时变量,例如:,。,想将和的值互换,可以用以下赋值语句实现:,ab,;,ba,;,ab,;,(,),(,ab,的结果,,a,已变成),(,),(,ba,的结果,,b,已变成),(,),(,ab,的结果,,a,已变成),14,执行前两个赋值语句:,“,;,”,和,“,;,”,相当于,b=,b(ab,),。,再执行第三个赋值语句:,。由于,a,的值等于(,),,b,的值等于(,),因此,相当于,a=,,即,a,的值等于,,等于。,得到原来的值。,即等效于以下两步:,15,12.1.4“,取反”运算符(),是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,将变。例如,是对八进制数(即二进制数)按位求反。,0000000000010101,(),1111111111101010,(,八进制数,177752),16,L6,L7,17,L8,L9,18,12.1.5,左移运算符(),左移运算符是用来将一个数的各二进制位全部左移若干位。,例如:,a=),右移运算符是,a2,表示将,a,的各二进制位右移,2,位,移到右端的低位被舍弃,对无符号数,高位补,0,。,例如:,a=017,时,:,a,的值用二进制形式表示为,00001111,,舍弃低,2,位,11,:,a2=00000011,右移一位相当于除以,2,右移,n,位相当于除以,2n,。,21,在右移时,需要注意符号位问题:,对无符号数,右移时左边高位移入,0,;对于有符号的值,如果原来符号位为,0(,该数为正,),则左边也是移入,0,。如果符号位原来为,1(,即负数,),则左边移入,0,还是,1,要取决于所用的计算机系统。有的系统移入,0,有的系统移入,1,。移入,0,的称为“逻辑右移”,即简单右移;移入,1,的称为“算术右移”。,22,例:,a,的值是八进制数,113755,:,a:1001011111101101,(用二进制形式表示),a1:0100101111110110 (,逻辑右移时,),a1:1100101111110110 (,算术右移时,),在有些系统中,a1,得八进制数,045766,而在另一些系统上可能得到的是,145766,。,Turbo C,和其他一些,C,编译采用的是算术右移,即对有符号数右移时,如果符号位原来为,1,,左面移入高位的是,1,。,23,12.1.7,位运算赋值运算符,位运算符与赋值运算符可以组成复合赋值运算符。,例如,:&=,|=,=,=,=,例:,a&=b,相当于,a=a&b,a =2,相当于,a=a 4,目的是使要取出的那几位移到最右端,未右移时的情况 右移,4,位后的情况,26,设置一个低,4,位全为,1,其余全为,0,的数。,(0 4)&(0 4),程序如下:,#include,void main(),unsigned,a,b,c,d,;,scanf(“%o”,&a,);,b=a4;,c=,(,04);,d=,b&c,;,printf(“%o,%dn%o,%dn”,a,a,d,d,);,运行情况如下:(输入),,,217,(的值),,,13,(的值),输入的值为八进制数,331,,,其二进制形式为,11011001,经运算最后得到的,d,为,00001101,即八进制数,十进制数,13,。,27,例,12.2,循环移位,要求将进行右循环移位,将右循环移位,即将中原来左面()位右移位,原来右端位移到最左面位。,28,将的右端位先放到中的高位中,实现语句:();,将右移位,其左面高位位补,,实现语句:;,将与进行按位或运算,即,|,;,步骤:,29,程序如下:,#include,void main(),unsigned,a,b,c,;,int,n;,scanf(“a,=%,o,n,=%,d”,&a,&n,);,b=an;,c=,c|b,;,printf(“%on%o”,a,c,);,运行情况如下:,,,3,运行开始时输入八进制数,157653,,,即二进制数,1101111110101011,循环右移位后得二进制数,0111101111110101,即八进制数,75765,30,12.3,位,段,信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用或表示,只需位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。,31,可以人为地将一个整型变量,data,分为几部分。,但是用这种方法给一个字节中某几位赋值太麻烦。可以位段结构体的方法。,怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢?可以用以下两种方法,:,(,2,)位段,C,语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”,(bit field),。利用位段能够用较少的位数存储数据。,32,程序如下:,struct,packed-data,unsigned,:;,unsigned,:;,unsigned,:;,unsigned,:;,int,;,data,;,33,(,1,)位段成员的类型必须指定为,unsigned,或,int,类型。,(,2,),若某一位段要从另一个字开始存放,可用以下形式定义:,unsigned,:,1,;,unsigned,b,:;一个存储单元,unsigned,:;,unsigned,:;另一存储单元,a,、,b,、,c,应连续存放在一个存储单元中,由于用了长度为的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,只将,a,、,b,存储在一个存储单元中,,c,另存在下一个单元,(“,存储单元”可能是一个字节,也可能是,2,个字节,视不同的编译系统而异,),。,关于位段的定义和引用的说明:,34,(3),一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。,(4),可以定义无名位段。,(5),位段的长度不能大于存储单元的长度,也不能定义位段数组。,(6),位段可以用整型格式符输出。,(7),位段可以在数值表达式中引用,它会被系统自动地转换成整型数。,关于位段的定义和引用的说明:,35,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!