《计算机C语言9a.ppt》由会员分享,可在线阅读,更多相关《计算机C语言9a.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九章第九章位运算位运算9.1位运算符与位运算位运算符与位运算9.2位段位段9.3程序设计举例程序设计举例 9.1 位运算符与位运算位运算符与位运算9.1.1 位运算符位运算符9.1.2 按位取反运算符n n按位取反运算符按位取反运算符按位取反运算符按位取反运算符“”是一个单目运算符,能对一是一个单目运算符,能对一是一个单目运算符,能对一是一个单目运算符,能对一个二进制数的每一位都取反,即个二进制数的每一位都取反,即个二进制数的每一位都取反,即个二进制数的每一位都取反,即0 0变为变为变为变为1 1,1 1变为变为变为变为0 0。例:例:例:例:a=00011010a=00011010a=11
2、100101a=111001019.1.3 左移运算符左移运算符n n左移运算符左移运算符“”的功能是将一个数的各的功能是将一个数的各个二进制位全部向左平移若干位,左边移个二进制位全部向左平移若干位,左边移出的部分予以忽略,右边空出的位置补零。出的部分予以忽略,右边空出的位置补零。例:例:a a=00011010=00011010a2=01101000a”的功能是将一个数的各个二进制位全部向的功能是将一个数的各个二进制位全部向的功能是将一个数的各个二进制位全部向的功能是将一个数的各个二进制位全部向右平移若干位,右边移出的部分予以忽略,左边空出的位置右平移若干位,右边移出的部分予以忽略,左边空出
3、的位置右平移若干位,右边移出的部分予以忽略,左边空出的位置右平移若干位,右边移出的部分予以忽略,左边空出的位置对于无符号数补零,对于有符号数,若原符号位为对于无符号数补零,对于有符号数,若原符号位为对于无符号数补零,对于有符号数,若原符号位为对于无符号数补零,对于有符号数,若原符号位为0 0,则补,则补,则补,则补0 0,若原符号位为,若原符号位为,若原符号位为,若原符号位为1 1,则全补,则全补,则全补,则全补1 1。也就是右移后保持这个数的正。也就是右移后保持这个数的正。也就是右移后保持这个数的正。也就是右移后保持这个数的正负符号不变。负符号不变。负符号不变。负符号不变。例:若变量例:若变
4、量例:若变量例:若变量a a被定义成被定义成被定义成被定义成unsignedcharunsignedchar,即无符号型,则有:,即无符号型,则有:,即无符号型,则有:,即无符号型,则有:a a=10011010=10011010a2a2=00100110=00100110若变量若变量若变量若变量a a被定义成被定义成被定义成被定义成charchar,即有符号型,则有:,即有符号型,则有:,即有符号型,则有:,即有符号型,则有:a a=10011010=10011010a2a2=11100110=11100110n n同样,一个数据每右移同样,一个数据每右移同样,一个数据每右移同样,一个数据每
5、右移1 1位相当于除以位相当于除以位相当于除以位相当于除以2 2,右移,右移,右移,右移2 2位相当于除位相当于除位相当于除位相当于除以以以以4 4,以此类推,以此类推,以此类推,以此类推。9.1.5 按位与运算符按位与运算符n n运算符运算符运算符运算符“&”&”将其两边数据对应的各个二进制位分别进将其两边数据对应的各个二进制位分别进将其两边数据对应的各个二进制位分别进将其两边数据对应的各个二进制位分别进行行行行“与与与与”运算,即二者都为运算,即二者都为运算,即二者都为运算,即二者都为1 1时结果为时结果为时结果为时结果为1 1,否则为,否则为,否则为,否则为0 0。例:例:例:例:a a
6、=10111010=10111010bb=01101110=01101110a&ba&b=00101010=00101010可以发现,任何一位与可以发现,任何一位与可以发现,任何一位与可以发现,任何一位与1“1“与与与与”运算时,结果保持运算时,结果保持运算时,结果保持运算时,结果保持原值,与原值,与原值,与原值,与0“0“与与与与”运算时,结果皆为运算时,结果皆为运算时,结果皆为运算时,结果皆为0 0。如果参加如果参加如果参加如果参加&运算的是负数运算的是负数运算的是负数运算的是负数(如如如如-3&-5)-3&-5),则以补码形,则以补码形,则以补码形,则以补码形式表示为二进制数,然后按位进
7、行式表示为二进制数,然后按位进行式表示为二进制数,然后按位进行式表示为二进制数,然后按位进行“与与与与”运算。运算。运算。运算。按位与有一些特殊的用途:按位与有一些特殊的用途:按位与有一些特殊的用途:按位与有一些特殊的用途:(1 1)清零。)清零。)清零。)清零。如果想将一个数的某些位清零,只要找一个二进制数,如果想将一个数的某些位清零,只要找一个二进制数,如果想将一个数的某些位清零,只要找一个二进制数,如果想将一个数的某些位清零,只要找一个二进制数,其中相应位为其中相应位为其中相应位为其中相应位为0 0,然后使二者进行,然后使二者进行,然后使二者进行,然后使二者进行&运算,即可达到清零目的。
8、运算,即可达到清零目的。运算,即可达到清零目的。运算,即可达到清零目的。例例例例:数为数为数为数为0010101100101011,现使它低四位清零。另找一个数,设,现使它低四位清零。另找一个数,设,现使它低四位清零。另找一个数,设,现使它低四位清零。另找一个数,设它为它为它为它为1001000010010000,低四位均为,低四位均为,低四位均为,低四位均为0 0。将两个数进行。将两个数进行。将两个数进行。将两个数进行&运算:运算:运算:运算:00101011&10010000=0000000000101011&10010000=00000000 当然也可以不用当然也可以不用当然也可以不用当
9、然也可以不用1001000010010000这个数而用其他数这个数而用其他数这个数而用其他数这个数而用其他数(如如如如01000000)01000000)也可以。也可以。也可以。也可以。(2 2)保留一个数中某些指定位。)保留一个数中某些指定位。)保留一个数中某些指定位。)保留一个数中某些指定位。如果想保留一个数中某些指定位,如果想保留一个数中某些指定位,如果想保留一个数中某些指定位,如果想保留一个数中某些指定位,只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为1 1,然后使二者进行,然后使二者进行,然后使二者进行
10、,然后使二者进行&运算,运算,运算,运算,即可达到目的。即可达到目的。即可达到目的。即可达到目的。如有一个整数如有一个整数如有一个整数如有一个整数a a(2 2个字节),想要其中的低字节。只需将个字节),想要其中的低字节。只需将个字节),想要其中的低字节。只需将个字节),想要其中的低字节。只需将a a与(与(与(与(377377)o o按位与即可。按位与即可。按位与即可。按位与即可。【例例例例9.19.1】将一个十进制数转换为二进制数。将一个十进制数转换为二进制数。将一个十进制数转换为二进制数。将一个十进制数转换为二进制数。分析:分析:分析:分析:C C语言中语言中语言中语言中printfpr
11、intf函数提供的函数提供的函数提供的函数提供的%x%x、%d%d、%o%o格格格格式符可将一个整数以十六进制、十进制或八进制的形式符可将一个整数以十六进制、十进制或八进制的形式符可将一个整数以十六进制、十进制或八进制的形式符可将一个整数以十六进制、十进制或八进制的形式输出,但没有二进制输出格式。人工转换的方法是式输出,但没有二进制输出格式。人工转换的方法是式输出,但没有二进制输出格式。人工转换的方法是式输出,但没有二进制输出格式。人工转换的方法是设置一个屏蔽字,其中只有一位是设置一个屏蔽字,其中只有一位是设置一个屏蔽字,其中只有一位是设置一个屏蔽字,其中只有一位是1 1,其余各位均为,其余各
12、位均为,其余各位均为,其余各位均为0 0,与被转换数进行,与被转换数进行,与被转换数进行,与被转换数进行“与与与与”运算,根据运算结果判断运算,根据运算结果判断运算,根据运算结果判断运算,根据运算结果判断被测试的那一位是被测试的那一位是被测试的那一位是被测试的那一位是1 1还是还是还是还是0 0,其余二进位的测试方法,其余二进位的测试方法,其余二进位的测试方法,其余二进位的测试方法相同。一个整数占相同。一个整数占相同。一个整数占相同。一个整数占4 4个字节,共有个字节,共有个字节,共有个字节,共有3232个二进制位。个二进制位。个二进制位。个二进制位。n n/*01*/#include/*01
13、*/#includen n/*02*/voidmain()/*02*/voidmain()n n/*03*/*03*/n n/*04*/*04*/intint i,biti,bit;n n/*05*/*05*/unsignedunsignedintint n,maskn,mask;n n/*06*/*06*/mask=0 x80000000;/*mask=0 x80000000;/*最高位为最高位为最高位为最高位为1,1,其余位为其余位为其余位为其余位为0*/0*/n n/*07*/*07*/printf(enterprintf(enteryournumber:);yournumber:);n
14、 n/*08*/*08*/scanf(%d,&nscanf(%d,&n););n n/*09*/*09*/printf(binaryprintf(binaryof%dof%dis:,nis:,n););n n/*10*/*10*/for(ifor(i=0;i32;i+)=0;i1;/*1;/*右移一位右移一位右移一位右移一位,得到下一个屏蔽字得到下一个屏蔽字得到下一个屏蔽字得到下一个屏蔽字*/n n/*15*/*15*/n n/*16*/*16*/n n程序运行过程:程序运行过程:程序运行过程:程序运行过程:n nenteryournumber:enteryournumber:n n8 8 n
15、 nbinaryof8is:00000000000000000000000000001000binaryof8is:000000000000000000000000000010009.1.6 按位或运算符按位或运算符 n n运算符运算符运算符运算符“|”|”将两边对应的二进制位分别进行将两边对应的二进制位分别进行将两边对应的二进制位分别进行将两边对应的二进制位分别进行“或或或或”运算,即运算,即运算,即运算,即二者之中只要有一个为二者之中只要有一个为二者之中只要有一个为二者之中只要有一个为1 1时结果就为时结果就为时结果就为时结果就为1 1,两者都为,两者都为,两者都为,两者都为0 0时结果才
16、时结果才时结果才时结果才为为为为0 0。例:例:例:例:a a=10011010=10011010/*/*十六进制为十六进制为十六进制为十六进制为9a*/9a*/bb=01010110=01010110/*/*十六进制为十六进制为十六进制为十六进制为56*/56*/a|ba|b=11011110=11011110/*/*十六进制为十六进制为十六进制为十六进制为de*/de*/可以发现,任何一位与可以发现,任何一位与可以发现,任何一位与可以发现,任何一位与0“0“或或或或”时,其结果就等同于这一位。时,其结果就等同于这一位。时,其结果就等同于这一位。时,其结果就等同于这一位。按位或有一些特殊的用
17、途:按位或有一些特殊的用途:按位或有一些特殊的用途:按位或有一些特殊的用途:(1 1)将一个数中某些指定位置)将一个数中某些指定位置)将一个数中某些指定位置)将一个数中某些指定位置1 1。只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为只要找一个二进制数,其中相应位为1 1,然后使二者进行,然后使二者进行,然后使二者进行,然后使二者进行或运算,即可达到目的。或运算,即可达到目的。或运算,即可达到目的。或运算,即可达到目的。(2 2)保留一个数中某些指定位。如果想保留一个数中某些指定)保留一个数中某些指定位。如果想保留一个数中某些指定)保留一个数中
18、某些指定位。如果想保留一个数中某些指定)保留一个数中某些指定位。如果想保留一个数中某些指定位,只要找一个二进制数,其中相应位为位,只要找一个二进制数,其中相应位为位,只要找一个二进制数,其中相应位为位,只要找一个二进制数,其中相应位为0 0,然后使二者进行,然后使二者进行,然后使二者进行,然后使二者进行或运算,即可达到目的。或运算,即可达到目的。或运算,即可达到目的。或运算,即可达到目的。9.1.7 按位异或运算符按位异或运算符 n n按位异或运算符按位异或运算符按位异或运算符按位异或运算符“”的作用是判断两个相应位的的作用是判断两个相应位的的作用是判断两个相应位的的作用是判断两个相应位的值是
19、否值是否值是否值是否“相异相异相异相异”(不同),若为异,则结果为(不同),若为异,则结果为(不同),若为异,则结果为(不同),若为异,则结果为1 1,否则为,否则为,否则为,否则为0 0。例:例:例:例:a=10011010b=01010110ab=11001100可以发现,任何一位与可以发现,任何一位与1“异或异或”时,其结果时,其结果是将这一位取反,即由是将这一位取反,即由1变成变成0,或者由,或者由0变成变成1。任何一位与任何一位与0“异或异或”时,其结果保留原值。时,其结果保留原值。按位异或运算符的一些特殊的用途:按位异或运算符的一些特殊的用途:(1)(1)使特定位翻转使特定位翻转使
20、特定位翻转使特定位翻转要使哪几位翻转就将与其进行要使哪几位翻转就将与其进行要使哪几位翻转就将与其进行要使哪几位翻转就将与其进行运算的该几位置为运算的该几位置为运算的该几位置为运算的该几位置为1 1即可。假设有即可。假设有即可。假设有即可。假设有0111101001111010,想使其低,想使其低,想使其低,想使其低4 4位翻转,即位翻转,即位翻转,即位翻转,即1 1变为变为变为变为0 0,0 0变为变为变为变为1 1。0111101001111010()00001111)000011110111010101110101结果值的低结果值的低结果值的低结果值的低4 4位正好是原数低位正好是原数低位
21、正好是原数低位正好是原数低4 4位的翻转。位的翻转。位的翻转。位的翻转。(2)(2)与与与与0 0相相相相,保留原值,保留原值,保留原值,保留原值如如如如01201200=01200=0120000101000001010()00000000)000000000000101000001010因为原数中的因为原数中的因为原数中的因为原数中的1 1与与与与0 0进行进行进行进行运算得运算得运算得运算得1 1,0 00 0得得得得0 0,故保留原数。,故保留原数。,故保留原数。,故保留原数。(3)(3)交换两个值,不用临时变量交换两个值,不用临时变量交换两个值,不用临时变量交换两个值,不用临时变量假
22、如假如假如假如a=3a=3,b=4b=4。想将。想将。想将。想将a a和和和和b b的值互换,可以用以下赋值语句实现:的值互换,可以用以下赋值语句实现:的值互换,可以用以下赋值语句实现:的值互换,可以用以下赋值语句实现:a=a=a ab b;b=b=b ba a;a=a=a ab b;9.2 位段位段9.2.1 位段结构体说明位段结构体说明位段结构体说明的一般形式为:位段结构体说明的一般形式为:位段结构体说明的一般形式为:位段结构体说明的一般形式为:structstruct位段结构体名位段结构体名位段结构体名位段结构体名 unsignedunsignedintint位段名位段名位段名位段名1:
23、k1;1:k1;unsignedunsignedintint位段名位段名位段名位段名2:k2;2:k2;unsignedunsignedintint位段名位段名位段名位段名n:knn:kn;其中其中其中其中k1k1,k2k2,knkn,一般是,一般是,一般是,一般是0909中的一个数,表示中的一个数,表示中的一个数,表示中的一个数,表示某位段成员占的二进制位数某位段成员占的二进制位数某位段成员占的二进制位数某位段成员占的二进制位数(位段的宽度)。(位段的宽度)。(位段的宽度)。(位段的宽度)。位段成员的类型只能是位段成员的类型只能是位段成员的类型只能是位段成员的类型只能是intint 或或或或
24、unsignedunsignedintint;在每个字;在每个字;在每个字;在每个字段说明的最后需要给出该字段的二进制位数,任一字段的位数段说明的最后需要给出该字段的二进制位数,任一字段的位数段说明的最后需要给出该字段的二进制位数,任一字段的位数段说明的最后需要给出该字段的二进制位数,任一字段的位数不能超过一个字(一个不能超过一个字(一个不能超过一个字(一个不能超过一个字(一个intint)的长度。)的长度。)的长度。)的长度。例:例:例:例:structstructpacked-datapacked-dataunsignedunsigneda:2;a:2;unsignedunsignedb:
25、6;b:6;unsignedunsignedc:4;c:4;unsignedunsignedd:4;d:4;intinti;i;data;data;其中其中其中其中a a、b b、c c、d d分别占分别占分别占分别占2 2位、位、位、位、6 6位、位、位、位、4 4位、位、位、位、4 4位位位位,共占共占共占共占2 2个字节。个字节。个字节。个字节。i i为为为为整型。整型。整型。整型。也可以使各个位段不恰好占满一个字节。也可以使各个位段不恰好占满一个字节。也可以使各个位段不恰好占满一个字节。也可以使各个位段不恰好占满一个字节。structstructpacked-datapacked-da
26、ta unsignedunsigneda:2;a:2;unsignedunsignedb:3;b:3;unsignedunsignedc:4;c:4;intinti;i;structstructpacked-datapacked-datadata;data;其中其中其中其中a a、b b、c c共占共占共占共占9 9位,占位,占位,占位,占1 1个字节多,不到个字节多,不到个字节多,不到个字节多,不到2 2个字节。它的后面为个字节。它的后面为个字节。它的后面为个字节。它的后面为intint型,占型,占型,占型,占2 2个字节。在个字节。在个字节。在个字节。在a a、b b、c c之后之后之后之
27、后7 7位空间闲置不用,位空间闲置不用,位空间闲置不用,位空间闲置不用,i i从另一字节开从另一字节开从另一字节开从另一字节开头起存放。头起存放。头起存放。头起存放。9.2.2 位段的引用位段的引用对位段的引用方法与引用结构体变量中的成员完全对位段的引用方法与引用结构体变量中的成员完全对位段的引用方法与引用结构体变量中的成员完全对位段的引用方法与引用结构体变量中的成员完全相同。相同。相同。相同。用位段结构体变量和成员运算符来引用位段。如:用位段结构体变量和成员运算符来引用位段。如:用位段结构体变量和成员运算符来引用位段。如:用位段结构体变量和成员运算符来引用位段。如:x.cx.c=10;=10
28、;x.ax.a=2;=2;注意:对位段赋值时,应不超过每一个位段能存储注意:对位段赋值时,应不超过每一个位段能存储注意:对位段赋值时,应不超过每一个位段能存储注意:对位段赋值时,应不超过每一个位段能存储的最大值(由位段的宽度决定的,如上例中的最大值(由位段的宽度决定的,如上例中的最大值(由位段的宽度决定的,如上例中的最大值(由位段的宽度决定的,如上例中x.ax.a的最大的最大的最大的最大值为值为值为值为3 3,x.cx.c的最大值为的最大值为的最大值为的最大值为1515),否则会溢出。),否则会溢出。),否则会溢出。),否则会溢出。也可以用指针变量指向一个成员为位段的结构体变也可以用指针变量指
29、向一个成员为位段的结构体变也可以用指针变量指向一个成员为位段的结构体变也可以用指针变量指向一个成员为位段的结构体变量,然后通过该指针变量来引用位段。如:量,然后通过该指针变量来引用位段。如:量,然后通过该指针变量来引用位段。如:量,然后通过该指针变量来引用位段。如:structstructpacked_datapacked_datax,*p;x,*p;p=&x;p=&x;p-a=10;p-a=10;p-c=2;p-c=2;【例例例例9.29.2】按位异或运算可用来实现交换两个变量的值(并且不用第三个变按位异或运算可用来实现交换两个变量的值(并且不用第三个变按位异或运算可用来实现交换两个变量的值
30、(并且不用第三个变按位异或运算可用来实现交换两个变量的值(并且不用第三个变量)。量)。量)。量)。/*01*/*01*/#include#include/*02*/*02*/voidmain()voidmain()/*03*/*03*/*04*/*04*/intinta,b;a,b;/*05*/*05*/a=10;a=10;/*06*/*06*/b=20;b=20;/*07*/*07*/printf(“aprintf(“a=%=%dtbdtb=%=%dn”,adn”,a,b);,b);/*08*/*08*/a=a=abab;/*09*/*09*/b=b=baba;/*10*/*10*/a=a=
31、abab;/*11*/*11*/printf(“aprintf(“a=%=%dtbdtb=%=%dn”,adn”,a,b);,b);/*12*/*12*/运行结果为:运行结果为:运行结果为:运行结果为:a=10b=20a=10b=20a=20b=10a=20b=109.3 程序设计举例【例例9.39.3】机器中有一个机器字称为处理机状态字,机器中有一个机器字称为处理机状态字,它由若干字段组成,它反映处理机运行的状态。假它由若干字段组成,它反映处理机运行的状态。假设第设第5757位是处理机的优先级,有时需要改变优先级,位是处理机的优先级,有时需要改变优先级,就必须取出第就必须取出第5757位。设
32、计一个程序取出处理机状态位。设计一个程序取出处理机状态字的优先级。字的优先级。如下如下:(图图)n n/*/*源程序名:源程序名:源程序名:源程序名:CH0903.C*/CH0903.C*/n n/*01*/*01*/#include#includen n/*02*/*02*/voidmain()voidmain()n n/*03*/*03*/n n/*04*/*04*/unsignedunsignedintint psps=0170360;=0170360;n n/*05*/*05*/intintp,n,t;p,n,t;n n/*06*/*06*/p=7;p=7;/*/*开始位置开始位置开始
33、位置开始位置*/n n/*07*/*07*/n=3;n=3;/*/*位数位数位数位数*/n n/*08*/*08*/psps=psps(p-n+1);(p-n+1);/*/*将将将将psps的的的的5757位右移到位右移到位右移到位右移到0202位位位位*/n n/*09*/*09*/t=(0n);t=(0n);/*/*将将将将315315位置为位置为位置为位置为0 0,0202位置为位置为位置为位置为1*/1*/n n/*10*/*10*/psps=ps&tps&t;/*/*取出需要的位取出需要的位取出需要的位取出需要的位*/n n/*11*/*11*/printf(“psprintf(“p
34、s=%=%on”,pson”,ps););n n/*12*/*12*/n n运行结果为:运行结果为:运行结果为:运行结果为:n npsps=7=7【例例9.49.4】设计一个函数,通过调用函数设计一个函数,通过调用函数read_modemread_modem()(),从调制解调器端口读入一个字符,从调制解调器端口读入一个字符,并将奇偶校验位置成并将奇偶校验位置成0 0。n n字节的位字节的位字节的位字节的位8 8是奇偶位,将该字节与一个位是奇偶位,将该字节与一个位是奇偶位,将该字节与一个位是奇偶位,将该字节与一个位1 1到位到位到位到位7 7为为为为1 1、位、位、位、位8 8为为为为0 0的
35、字节进行与操作,可将该字节的的字节进行与操作,可将该字节的的字节进行与操作,可将该字节的的字节进行与操作,可将该字节的奇偶校验位置成奇偶校验位置成奇偶校验位置成奇偶校验位置成0 0。表达式。表达式。表达式。表达式ch&127ch&127正是将正是将正是将正是将chch中中中中每一位同每一位同每一位同每一位同127127数字的对应位进行与操作,结果数字的对应位进行与操作,结果数字的对应位进行与操作,结果数字的对应位进行与操作,结果cch h的位的位的位的位8 8被置成了被置成了被置成了被置成了0 0。n n/*/*源程序名:源程序名:源程序名:源程序名:CH0904.C*/CH0904.C*/n
36、 n/*01*/*01*/charcharget_char_from_modemget_char_from_modem()()n n/*02*/n n/*03*/charch;n n/*04*/*04*/chch=read_modemread_modem();();/*/*从调制解调器端口中得到一个字符从调制解调器端口中得到一个字符从调制解调器端口中得到一个字符从调制解调器端口中得到一个字符*/n n/*05*/*05*/return(ch&127);return(ch&127);/*/*可将可将可将可将chch的奇偶校验位置成的奇偶校验位置成的奇偶校验位置成的奇偶校验位置成0*/0*/n n
37、/*06*/*06*/【例例9.59.5】位操作符经常用在加密程序中,可以在文位操作符经常用在加密程序中,可以在文件上做一些位操作,从而对原文件进行编码,生成件上做一些位操作,从而对原文件进行编码,生成一个不可读磁盘文件。最简单的方法是通过反码运一个不可读磁盘文件。最简单的方法是通过反码运算,将每个字节的每一位取反。设计一个函数算,将每个字节的每一位取反。设计一个函数encode()encode()对字符进行编码。对字符进行编码。n n/*/*源程序名:源程序名:源程序名:源程序名:CH0905.C*/CH0905.C*/n n/*01*/*01*/charcharencode(chencod
38、e(ch)n n/*02*/*02*/n n/*03*/*03*/charcharchch;n n/*04*/*04*/return(return(chch););/*/*反码运反码运反码运反码运算,对字符进行编码算,对字符进行编码算,对字符进行编码算,对字符进行编码*/n n/*05*/*05*/习题二n n一、选择题一、选择题一、选择题一、选择题n n1.1.在位运算中,操作数每左移一位,则结果相当于在位运算中,操作数每左移一位,则结果相当于在位运算中,操作数每左移一位,则结果相当于在位运算中,操作数每左移一位,则结果相当于_。n nA.A.操作数乘以操作数乘以操作数乘以操作数乘以2B.2
39、B.操作数除以操作数除以操作数除以操作数除以2 2n nC.C.操作数除以操作数除以操作数除以操作数除以4D.4D.操作数乘以操作数乘以操作数乘以操作数乘以4 4n n2.2.若有运算符若有运算符若有运算符若有运算符,sizeofsizeof,&=,&=,则它们按优先级由高则它们按优先级由高则它们按优先级由高则它们按优先级由高至低的正确排列次序是至低的正确排列次序是至低的正确排列次序是至低的正确排列次序是_。n nA.sizeofA.sizeof,&=,&=,B.sizeofB.sizeof,&=,&=n nC.,C.,sizeofsizeof,&=D.,&=,&=D.,&=,sizeofsi
40、zeofn n3.3.在在在在c c语言中语言中语言中语言中,要求运算数必须是整型或字符型的运算符要求运算数必须是整型或字符型的运算符要求运算数必须是整型或字符型的运算符要求运算数必须是整型或字符型的运算符是是是是_。n nA.&B.&C.!D.|A.&B.&C.!D.|n n4.4.以下叙述中不正确的是以下叙述中不正确的是以下叙述中不正确的是以下叙述中不正确的是_。n nA.A.表达式表达式表达式表达式a&=ba&=b等价于等价于等价于等价于a=a=a&ba&bB.B.表达式表达式表达式表达式a|=ba|=b等价于等价于等价于等价于a=a=a|ba|bn nC.C.表达式表达式表达式表达式a
41、!=ba!=b等价于等价于等价于等价于a=a=a!ba!bD.D.表达式表达式表达式表达式a=ba=b等价于等价于等价于等价于a=a=ababn n二、填空题二、填空题n n1.1.在在在在c c语言中语言中语言中语言中,&,&运算符作为单目运算符时表示的运算符作为单目运算符时表示的运算符作为单目运算符时表示的运算符作为单目运算符时表示的是是是是_运算运算运算运算;作为双目运算符时表示的是作为双目运算符时表示的是作为双目运算符时表示的是作为双目运算符时表示的是_运算运算运算运算n n2.2.与表达式与表达式与表达式与表达式 a&=ba&=b等价的另一书写形式是等价的另一书写形式是等价的另一书写
42、形式是等价的另一书写形式是_。n n3.3.与表达式与表达式与表达式与表达式x=y-2x=y-2等价的另一书写形式是等价的另一书写形式是等价的另一书写形式是等价的另一书写形式是_。n n4.4.若若若若x=2,y=3,x=2,y=3,则则则则x&yx&y的结果是的结果是的结果是的结果是_。n n5.5.设设设设a a,b b为整型量,且为整型量,且为整型量,且为整型量,且a=7a=7,b=8b=8,则表达式,则表达式,则表达式,则表达式 a=a|b2&ba=a|b2&b的值为的值为的值为的值为_。n n6.6.设二进制数设二进制数设二进制数设二进制数a a是是是是001011010010110
43、1,若想通过异或,若想通过异或,若想通过异或,若想通过异或运算运算运算运算abab使使使使a a的高的高的高的高4 4位取反,低位取反,低位取反,低位取反,低4 4位不变,则二进位不变,则二进位不变,则二进位不变,则二进制数制数制数制数b b应是应是应是应是_。n n三、程序分析题三、程序分析题(分析程序,写出运行结果分析程序,写出运行结果)n n1.1.下面程序段的运行结果是:下面程序段的运行结果是:下面程序段的运行结果是:下面程序段的运行结果是:_n nunsigneda=0356,b;unsigneda=0356,b;n nb=b=a|aa|a2+1;2+1;n nprintf(“%xn
44、”,bprintf(“%xn”,b););n n2.2.请读程序片段请读程序片段请读程序片段请读程序片段:n nintinta=1,b=2;a=1,b=2;n nif(a&bif(a&b)printfprintf(*n);(*n);n nelseelseprintfprintf($n);($n);n n以上程序片段的输出结果是:以上程序片段的输出结果是:以上程序片段的输出结果是:以上程序片段的输出结果是:_n n3.3.n n#include#includestdio.hstdio.h n nvoidmain()voidmain()n n charx=040;charx=040;printfp
45、rintf(“%(“%dndn”,x=x1);”,x=x4);/*b=(a4);/*将变量将变量将变量将变量a a右移右移右移右移4 4位位位位*/n nc=(04);/*c=(01)0;i+);for(i=1;(v=v1)0;i+);/*/*计算计算计算计算intint 单元中的位数单元中的位数单元中的位数单元中的位数*/n nprintf(nTheprintf(nThelengthofINTlengthofINTis:%dis:%d,(i);,(i);n n n n四、程序设计题四、程序设计题n n1.1.取一个整数取一个整数取一个整数取一个整数a a从右端开始的从右端开始的从右端开始的从右端开始的4 47 7位。位。位。位。n n2.2.输出一个整数中由输出一个整数中由输出一个整数中由输出一个整数中由8 81111位构成的数。位构成的数。位构成的数。位构成的数。n n3.3.从键盘上输入从键盘上输入从键盘上输入从键盘上输入1 1个正整数给个正整数给个正整数给个正整数给intint变量变量变量变量numnum,按,按,按,按二进制位输出该数。二进制位输出该数。二进制位输出该数。二进制位输出该数。