1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,12,章 位运算,位运算,位赋值运算符,位段,应用举例,3.,位运算有,:,12.1,位运算,1,.,位运算和指针一样,都是,C,语言的重要特色。,2,.,位运算,的概念,:,所谓位运算,是指进行二进制位的运算。,例如:将一个存储单元中的各二进制位左移或右移,1,位,两个数按位相加等。,位运算符,含义,举例,&,按位与,a&b,|,按位或,a|b,按位异或,a,b,按位取反,a,左移,a,右移,b2,说明:,(,1,)位运算量,a,,,b,只能是整型或字符型数据,不能是实型数据。,(,2,)位运算符中除
2、按位取反运算符,为单目运算符外,其它均为双目运算符。,12.1,位运算,12.1.1,位逻辑运算符,1,.,按位与运算符,&,运算规则:如果参加运算的两个运算量的相应位都是,1,,则该位的结果值为,1,,否则为,0,。,例如:,a:01111010,b:10011000,&:00011000,即,a&b,=0 x18,12.1,位运算,12.1.1,位逻辑运算符,2,.,按位或运算符,|,运算规则:如果两个运算量的相应位都是,0,,则该位的结果值为,0,,否则为,1,。,例如:,a:01111010,b:10011000,|:11111010,即,a|b,=0 xfa,12.1,位运算,12.
3、1.1,位逻辑运算符,3,.,按位异或运算符,运算规则:如果两个运算量的相应位不同,则该位的结果值为,1,,否则为,0,。,例如:,a:01111010,b:10011000,:11100010,即,ab,=0 xe2,12.1,位运算,12.1.1,位逻辑运算符,4,.,按位取反运算符,运算规则:对一个运算量的每一位都取反,即将,1,变为,0,,,0,变为,1,。,例如:,a:01111010,a:10000101,即,a=0 x85,12.1,位运算,12.1.1,位逻辑运算符,a,b,a&b,a|b,a,b,a,b,0,0,0,0,0,1,1,0,1,0,1,1,1,0,1,0,0,1,
4、1,0,1,1,1,1,1,0,0,0,位逻辑运算规则,12.1,位运算,12.1.1,位逻辑运算符,5,.,位逻辑运算符的用途,(,1,)判断一个数据的某位是否为,1,。,(,2,)屏蔽掉一个数据中的某些位。,(,3,)清零。,(,4,)保留若干位。,(,5,)把一个数据的某位置为,1,。,(,6,)把一个数据的某位翻转,即,1,变为,0,,,0,变为,1,。,12.1,位运算,12.1.2,移位运算符,1,.,左移运算符,运算规则:对,左边的运算量的每一位全部左移右边运算量表示的位数。,例如:,a2,表示将,a,的各位依次向左移,2,位,,a,的最高,2,位移出去舍弃,空出的低,2,位以,
5、0,填补。,a:,00100001,a,运算规则:对,左边的运算量的每一位全部右移右边运算量表示的位数,低位被移出去舍弃,空出的高位补,0,还是补,1,,分两种情况:,(,1,)对无符号数进行右移时,空出的高位补,0,。这种右移称为逻辑右移。,(,2,)对带符号数进行右移时,空出的高位以符号位填补。即正数补,0,,负数补,1,。这种右移称为算术右移。,12.2,位赋值运算符,位赋值运算符是位运算符与赋值运算符的结合。,位赋值运算符,含义,举例,等同于,&=,位与赋值,a&=b,a=,a&b,|=,位或赋值,a|=b,a=,a|b,=,位异或赋值,a,=b,a=,a,b,=,左移赋值,a=b,a
6、a=,右移赋值,a=b,a=ab,位赋值运算符,12.3,位段,C,语言允许在一个结构体中以位为单位来指定其成员所占的内存长度,这种以位为单位的成员称为“位段”或“位域”。“位段”或“位域”是一种特殊的结构体成员。,定义的一般格式为:,struct,结构体名,类型 成员,1:,长度,;,类型 成员,2:,长度,;,类型 成员,n:,长度,;,;,其中,冒号前的成员为位段,冒号后的长度表示存储位段需要占用字节的位数。,例如:,struct,device,unsigned a:1;,unsigned b:2;,unsigned c:4;,int,x;,float y;,data;,结构体变量,d
7、ata,包含,5,个成员,它们分别是,a,,,b,,,c,,,x,,,y,。,其中,,a,、,b,、,c,为位段,分别占用,1,位、,2,位、,4,位,即,a,、,b,、,c,共占用,7,位。这样,用一个字节就可以存储这三个位段。,x,、,y,为基本类型的成员,分别需要,2,个、,4,个字节存储。因此,结构体变量,data,需要占用,7,个字节的内存单元。,12.3,位段,例如:,struct,device,unsigned a:1;,unsigned b:2;,unsigned c:4;,int,x;,float y;,data;,1 4 2 1,1,个字节,2,个字节,4,个字节,x,y,
8、c,b,a,16,32,结构体变量,data,包含,5,个成员,它们分别是,a,,,b,,,c,,,x,,,y,。,其中,,a,、,b,、,c,为位段,分别占用,1,位、,2,位、,4,位,即,a,、,b,、,c,共占用,7,位。这样,用一个字节就可以存储这三个位段。,x,、,y,为基本类型的成员,分别需要,2,个、,4,个字节存储。因此,结构体变量,data,需要占用,7,个字节的内存单元。,12.4,应用举例,例,12-1,输出一个整数的二进制形式。,程序:,main(),int,num,bit,i,;,unsigned test=0 x8000;,printf(input,mum:);,
9、scanf(%d,&num,);,printf(binary,of%x is:,num);,for(i,=1;i=1;,运行结果:,input num:12345,binary of 3039 is:0011000000111001,12.4,应用举例,例,12-2,循环移位的实现。,左移,:,unsigned,rol(unsigned,x,int,n),unsigned y;,y=(x(16-n);,return(y,);,主程序:,main(),unsigned,rol(unsigned,x,int,n);,unsigned,ror(unsigned,x,int,n);,unsigned a;,int,n;,printf(input,a,n,:);,scanf(%x,%d,&a,&n,);,printf(a,=%x,rotleft,n=%d bit is%,xn,a,n,rol(a,n,);,printf(a,=%x,rotright,n=%d bit is%,xn,a,n,ror(a,n,);,右移,:,unsigned,ror(unsigned,x,int,n),unsigned y;,y=(x,n)|(x,(16-n);,return(y,);,小 结,位运算,位赋值运算符,位段,应用举例,作业和上机实验,






