第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位后得到00100000064,用八进制输出结果为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)=10a+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;
则执行以上语句后xy的值分别是     
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小时内删除。