第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) =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
负数二进制补码运算法则
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论