收藏 分销(赏)

C语言程序设计_位运算.ppt

上传人:xrp****65 文档编号:13091365 上传时间:2026-01-15 格式:PPT 页数:22 大小:229.50KB 下载积分:10 金币
下载 相关 举报
C语言程序设计_位运算.ppt_第1页
第1页 / 共22页
C语言程序设计_位运算.ppt_第2页
第2页 / 共22页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C,语言允许对内存中的,字节,或字节内的,二进制位,进行运算,即位运算,.,12.1,位运算符和位运算,位运算符共,6,种,:,&|,说明,:,1.,位运算符中除了,是单目运算符外,其余均为二目运算符,即要求运算符两侧各有一个运算对象,.,2.,运算对象只允许是,整型或字符型数据,.,包括,:,char,short,int,long,unsigned.,第十二章 位运算,12.1.1,“,按位相与”运算符,(,&,),作用,:,对参加运算的两个二进制数,按位进行逻辑与,运算,.,规则,:,0&0=0,1&0=0,0&1=0,1&1=1,例如,:a=1,b=2,则:,a&b=0,0000000,1,00000000,1111111,0,11111111,00000000,00000000,a,b,a&b,用途:,“与”,0,可以,屏蔽,掉某些位,“与”,1,可以,筛选,出某些位。典型的用法有:,清零。欲对一个字节清零,通常是“与”上,0 x00,。,取出一个数中的某些指定位。比如有一个整数,a,,,欲取出它的低,8,位,应:,00001001,00001100,11111111,00000000,00001001,00000000,a,0 x00ff,c,12.1.2,“,按位相或”运算符,(,|,),作用,:,对参加运算的两个二进制数,逐位,进行,逻辑或,运算,.,规则,:,0|0=0,1|0=1,0|1=1,1|1=1,例如,:a=1,b=1,则,:a|b=1.,00000001,00000000,11111111,11111111,11111111,11111111,a,b,a|b,用途:,“或”,1,可以,屏蔽,掉某些位,“或”,0,可以,筛选,出某些位。,典型的用法主要是:,置,1,。欲对某些位置,1,,只需在相应位上“或”,1,便可,。,例如,:a=15,b=0,则,:a b=15.,00001111,00000000,00000000,00000000,00001111,00000000,a,b,a b,例,:,main(),int,a=3,b=4;,a=,a b;,b=,b a;,a=,a b;,printf,(“%d,%d”,a,b);,输出,:4,3,00000011,00000000,00000100,00000000,00000111,00000000,a,b,a,00000011,00000000,b,00000100,00000000,a,12.1.3,“,按位异或”运算符,(,),作用,:,对参加运算的两个二进制数,按位,进行,逻辑异或,运算,.,规则,:,00=0,10=1,01=1,11=0,结论,:,利用异或运算,不必设置第三个变量就可以实现两个整型变量值的交换。,用途,:,某位“异或”,1,要变,某位“异或”,0,不变。,1),使指定位,翻转,。比如:要使一个字节的低四位翻转,只需异或,0 x0f,。,0010,0011,a,00001111,a,0 x0f,0010,1100,2),清零,。,一个整型,(,含字符型,),数据“异或”自身,便清零,.,00100011,a,a,00000000,00100011,a,12.1.4,“,按位取反”运算符,(,),作用,:,对一个二进制数,按位取反,是一个单目运算符,.,如,:a=15,则,a=65520,00000000,00001111,11111111,11110000,a,a,注意,:,和,!,运算符是两个完全不同的运算符。,的优先级与,+,!,相同,且结合性都是,从右至左,。,例如:,main(),int,a=0,b=1;,printf,(“%d,%d n”,a,b,);,printf,(“%d,%d n”,!a,!b,);,运行结果,:,1,2,1,0,00000000,00000000,11111111,1,1111111,0,0,应用举例,:,若有一个整数,a,,想,使它最低一位为,0,(即屏蔽,d0,位),而其它位不变。请问如何操作?,方法是,:,a=a&,1;,请问可用,a=a,吗?,答:对于以,16,位存放一个整型数据的计算机系统,后者也是可以的。但对于以,32,位(或更多位)存放一个整型数据的系统,(,如,VAX 11/780),,,后者是不可以的。因此,后者的,可移植性,很差;而前者则适合于任何系统,程序的可移植性好!,00001011,00000000,1111111,0,11111111,a,0 xfffe,00001011,00000000,1111111,0,11111111,00000010,00000000,00000000,00000000,a,0 xfffe,1111111,0,11111111,11111111,11111111,1,16,位整型,32,位整型,12.1.5,左移位运算,(,),作用:,将操作数的各个二进位顺序,左移,右端空出的位,补0,而移出左端之外的位则丢失.,如:,an,表示将,a,的各个二进位顺序左移,n,位,(n,为正整数,),.,例如:,a=25;,则,a3,的结果为,200,00011001,00000000,11001,000,000,00000,a,a3,说明,:,(1),对于,无符号数,左移,1,位,相当于乘,2,;左移,n,位,则乘,2,n,。,但是此结论只适用于该数左移时被溢出的最高位中没有,1,的情况。,(2),对于用补码表示的正数,如果左移出的全部是,0,且移出后的最高位仍为,0,时,数据不会溢出。,(3),对于用补码表示的负数,如果左移出的全部是,1,且移出后的最高位仍为,1,时,数据不会溢出。如,:,11111110,11111111,11110,000,11111111,2,23,(4),若非上面,(2),、,(3),所述情况,则数据左移后会产生溢出,那 就不能简单地用乘,2,来计算了。,如,:,有符号字符型数据,64,当它左移,2,位时,结果为,0,.,000,10000,0,0000000,按位取反加,1,得:,16,01000000,64,00000000,64,),作用:,将操作数的各个二进位顺序,右移,.左端空出的位,补0,或,补1,而移出右端的位则被舍去.,如:,an,表示将,a,的各个二进位顺序右移,n,位,.,说明,:,右移运算的结果与操作数的符号有关,.,就,Turbo C2.0,而言:,1),无符号数为“,逻辑右移,”,即左端空出位一律补,0,.,2),有符号数为“,算术右移,”,即正数右移,空位补,0,负数右移,空位补,1,.,一句话,算术右移是指最高位移入符号位。,其它系统对有符号数可能依然采用“逻辑右移”,这随系统而定,.,00000000,10000000,00000000,0,1000000,00000000,1,1000000,a,a 1,a 1,逻辑右移,结果为,16384,算术右移,结果为,16384,算术右移运算,相当于,除,2,运算,。右移,1,位,相当于除以,2,。右移,n,位,则除以,2,n,。,例如,:a=32768,12.1.7,位运算符的优先级与结合性,&|,2 5 8 9 10,高,低,结合性,:,运算是从右至左,其余均按从左至右。,12.1.8,由位运算构成的复合赋值运算符,&=,|=,=,=,如,:,a&=b,等价于,a=a&b,a =m+1,等价于,a=am+1,等价于,a=a 2&y 2)&(y 4,(2),设置一个低,4,位全为,1,其余位全为,0,的数,.,(0 4&(0 4;c=(0 4);d=b,printf,(“%on%on”,a,d);,11110000,11111111,00000000,00001111,12.2,位运算举例(自学),c,11111111,11111111,0,m;c=(0 n);d=b,00000000,1101,1001,00000000,0000,1101,a,d,1 0 0 0 1 0,0,1,右移,2,位,0,1,1,0 0 0 1 0,例,12.2,将一个整数,a,循环右移,n,位,。,所谓循环右移是将,a,最右端的位顺序移到,a,的最左端,而将,a,中原左端的各位顺序右移。,分析:,(1),将,a,左移,16,n,位并存入变量,b,中,(,即用,b,存放未来的高位,),。,b=a n,000,11011,11110101,c,011,11011,11110101,c,main(),unsignde,a,b ,c;,int,n;,scanf,(“%o,%d”,b=a n;,c=c|b ;,printf,(“%o n%o n”,a,c);,如输入,:157653,3,输出为,:157653,75765,同样的方法,可以实现,循环左移,。,11011111,10101,011,011,11011,11110101,a,c,12.3,位 段,以前,我们内存的存取都是以,字节,为单位,即信息存储至少要占用一个字节。实际上,有时存储一个信息不必占用一个或多个字节,而只需占用,1,位,或几位便可。这在计算机过程控制和数据通信领域经常会遇到。,C,语言提供对这方面的处理,而且可用以下两种方法实现:,1,、通过位运算实现,对,1,位或几位的操作:比如我们可以人为地将一个字节,data,划分为几项,假如是四项,a,、,b,、,c,、,d,,,且它们分别占,1,位、,3,位、,2,位、,2,位(如下图所示)。如果欲将,b,的值变为,6,,,则可以这样:,data,a,b,c,d,7,0,(1),将,b,项,(4 6,位,),清零,data=data,或者,data=data&,(,7,4);,(3),将,data,与“,64”,进行按位或运算,即可实现将,b,的值变为,6,。,1,0,0,0,1,1,1,1,7,0,(2),将数,6,左移,4,位,使,110,成为,4-6,位,0,1,1,0,0,0,0,0,7,0,x,0,0,0,x,x,x,x,x,1,1,0,x,x,x,x,data,data,|(64),(74),说明:其中,(1),步中的,0 x8f,,,称为,“屏蔽字”,,即把,data,中,b,的信息屏蔽掉,而其它信息不受影响。,2,、通过位段来实现,对,1,位或几位的操作:,C,语言允许在一个结构体中以位为单位来指定其成员所占内存的长度,这种以位为单位的成员称为“位段”,(,或“位域”,bit field),。,例如:,Struct,packed_data,unsigned a:2;,unsigned b:6;,unsigned c:4;,unsigned d:4;,int,i;,data;,Struct,packed_data,unsigned a:2;,unsigned b:3;,unsigned c:4;,int,i;,;,Struct,packed_data data;,a,b,c,d,i,16,4,4,6,2,a,b,c,空闲,i,16,7,4,3,2,7,0,15,23,31,关于位段的定义和引用的说明:,1),位段成员的类型必须指定为,unsigned,int,型。,2),若某一位段要从另一存储单元,(,字,),单独开始存放,应这样定义:,Struct,packed_data,unsigned a:1;,unsigned b:2;,unsigned :,0,;,unsigned c:3;,/*,在,Turbo C,中表示,c,从第,3,个字节开始存放,*,/,;,3),可以定义无名字段,如:,Struct,packed_data,unsigned a:1;,unsigned :2;,/*,表示这两位空间不用*,/,unsigned b:3;,unsigned c:4;,;,4),一个位段必须存储在同一存储单元,(,字,),中,不能跨越两个单元。如果第一个字不能容纳下一个位段,则该空间不用,而从,下一个字,开始存放。比如:,Struct,packed_data,unsigned a:5;,unsigned b:6;,unsigned c:6;,int,i;,;,Struct,packed_data data;,i,空闲,d,空闲,b,a,16,6,5,6,5,注意:,上面定义的结构体共占,6,个字节(,3,个字)。,15,0,10,0,15,5),位段的长度不能大于存储单元(字)的长度,也不能定义位段数组。,6),位段可以用整型格式符,(%d,%u,%o,%x),进行输出。如:,printf(“%d,%d,%d”,data.a,data.b,data.c,);,7),位段可以在数值表达式中引用,它会被系统自动地转换成整型数据来处理。如:,data.a+5/data.b,是合法的。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服