C语言各章节单元测试题及答案——位运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10章位运算
10.1典型考试题剖析
10.1.1选择题
【例1】整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是。
A) x || y B) x | y C) x & y D) x ^ y
✧考点:位运算的性质。
✧分析:答案A是两个非0数进行或运算,得到一定为非0值。
答案B是
两个非0数进行按位或运算,得到的也一定是非0值。
答案C是两个非
0数进行按位与运算,结果可能为0,也可能不为0。
答案D根据位运算
的性质可知,一个数和本身进行异或运算的值一定是0。
✧答案:D
【例2】以下程序的输出结果是。
main()
{ char x=040;
printf("%o\n",x<<1);}
A) 100 B) 80 C) 64 D) 32
✧考点:左移运算。
✧分析:040是八进制数,用二进制表示为00100000,左移1位后得到
001000000即64,用八进制输出结果为100。
✧答案:A
【例3】在位运算中,操作数每左移1位,相当于。
A) 操作数乘以2 B) 操作数除以2 C) 操作数乘以16 D) 操作数除以16
✧考点:左移运算的性质。
✧分析:因为位运算的操作对象是整型数据,所以乘、除2的整数倍可以
用移位来实现,左移1位相当乘以2,右移1位相当于除以2,用移位方
法作乘除运算速度快。
✧答案:A
【例4】下面语句输出结果是。
char a=7;
printf("%d,%d",~a,!a);
A) 0,8 B) 8,0 C) -8,0 D) 0,-8
✧考点:按位取反运算和非运算。
✧分析:此题考察逻辑反和按位取反的区别,求逻辑反时,只要a≠0就
按真算,即!a=0;按位取反时,00000111变为11111000此值正好是-
8的补码。
✧答案:C
【例5】设有以下语句,则z的二进制值是。
char x=3,y=12,z;
z=x^y<<2;
A ) 00110011 B) 00001111 C) 11110000 D) 00000000
✧考点:位运算的优先级。
✧分析:由于移位运算符的优先级高于异或运算符,所以先计算y<<2的
值为00110000,又知x的值为00000011,于是可得z=00110011。
✧答案:A
【例6】执行以下程序的输出结果是。
#include <stdio.h>
main()
{ unsigned short u;
short n;
u=024;n=-24;
printf("%d,%d,%d,%d\n",u<<2,u>>2,n<<2,n>>2);
}
A) 80,5,-80,-5 B) 80,5,-96,-6 C) 96,3,-96,-6 D) 96,6,-80,-5
✧考点:左移和右移位运算。
✧分析:本题考查含有八进制数的移位运算和负数的左、右移位运算。
024
是八进制数,C语言中八进制数无负数。
负数在机内是按补码存放的,
最高位是符号,“0”代表正,“1”代表负,其符号位可以像数字一样
参加运算,左移相当于乘以2,右移一位相当于除以2的规律仍然适用。
✧答案:B
10.1.2填空题
【例1】已知a为8位二进制数,要想通过a^b运算使a的低4位变反,高四位不变,b的值应为。
✧考点:按位异或运算的性质。
✧分析:根据按位异或运算的性质可知,与1异或得到的结果与原来的数
据相反,与0异或得到的结果与原来的数据相同。
因此a只需要低四位
与1异或,高四位与0异或即可。
✧答案: 00001111
【例2】设有以下变量说明,则a+(int)((int)b+c)>>(int)(b-c)的值为:。
int a=5;
float b=7.2,c=3.6;
✧考点:强制类型转换与位移操作。
✧分析:题目中的(int)=7,(int)((int)b+c)=10,a+10=15,又
(int)(b-c)=3,所以最后的算式为:15>>3。
✧答案: 1
【例3】下面程序段实现不借助中间变量而交换x与y的值,请填空。
int x=6,y=7;
x=x^y;
y= 【1】 ;
x= 【2】 ;
✧考点:异或运算的性质。
✧分析:根据异或运算的性质知道,进行三次按位异或运算操作可以交换
两变量的值。
答案:【1】y^x 【2】x^y
10.2自测练习与参考答案
10.2.1选择题
1.若有运算符<<,sizeof,^,&=,则它们按优先级由高到低的排列顺序是。
A) sizeof,&= ,<<,^ B) sizeof,<<,^,&=
C) ^,<<,sizeof,&= D) <<,^,&=,sizeof
2.以下叙述中不正确的是。
A) 表达式a&=b等价于a=a&b B) 表达式a|=b等价于a=a|b
C) 表达式a!=b等价于a=a!b D) 表达式a^=b等价于a=a^b
3.若有以下程序段。
int x=1,y=2;
x=x^y;
y=y^x;
x=x^y;
则执行以上语句后x和y的值分别是。
A) x=1,y=2 B) x=2,y=2 C) x=2,y=1 D) x=1,y=1
4.下面语句输出结果是。
printf("%d,%d",2&5,2&&5);
A) 1,1 B) 0,0 C) 0,1 D) 1,0
5.设i为十六进制数,若输入为abef,则运行结果是。
main()
{ int i,b,c;
scanf("%x",&i);
b=i>>(16-4)&0x000f;
c=i<<4;
c=c|b;
printf("%x",c);}
A) befa B) fabe C) efab D) abef
6.设有如下定义,则表达式a^b^b的值为。
unsigned int a=12255,b=195;
A) 0 B) 1 C) 195 D) 12255
7.请读程序片段:
char x=240;
x=x&017;
printf("%d,%o\n",x,x);
以上程序片段的输出结果是。
A) 255,377 B) 0,0 C) 240,15 D) 240,17
8.若有下面的说明和语句,则输出结果为。
char a=8,b=040;
printf("%o\n",~a&b<<1);
A) 40 B) 64 C) 80 D) 04
9.下面程序的输出结果是。
main()
{ int a=1;
printf("%d",~a);}
A) -2 B) -1 C) 0 D) 65534
10.设有以下说明:
struct packed
{ unsigned one:1;
unsigned two:2;
unsigned three:3;
unsigned four:4;
}data;
则以下位段数据的引用中不能得到正确的数值的是。
A) data.one=4 B) data.two=3
C) data.three=2 D) data.four=1
10.2.2填空题
1.与a^=b+c等价的表达式为。
2.表达式4+3<<2的值为。
3.设二进制数x的值是11001101,若想通过x&y运算使x中的低4位不变,高4位清零,则y的二进制数是。
4.把int类型变量low中的低字节和int型变量high中的高字节放入变量s中的表达式为。
10.2.3参考答案
一.选择题:
1.B
2.C
3.C
4.C
5.A
6.D
7.B
8.B
9.A 10.A
二.填空题:
1. a=a^(b+c)
2. 28
3. 00001111
4. s=high&0xff00|low&0x00ff。