习题10和参考解答
    1)选择题
1)以下运算符中优先级最低的是(  ),运算符中优先级最高的是(  )。
A&&            B&        C||            D
【答案】C    B
解析】本题主要考查C语言运算符的优先级关系。
2)表达式“0x13&0x17”的值是(  )。       
A0x17          B0x13          C0xf8            D0xec 
答案B
解析】将0x130x17转换成对应的二进制数后按位进行与运算,再把结果转换成八进制数,计算的结果为0x13
3)若x=2y=3,则x&y的结果是(  )。
A0              B2        C3              D5
答案B
解析x对应的二进制位为0010y对应的二进制位为0011,两者按位与后的结果为0010,故对应的十进制数为2
4)表达式 0x13 | 0x17的值是( )。       
A0x17        B0x13    C0xf8            D0xec
答案A
解析】将0x130x17转换成对应的二进制数后,按位进行或运算,再把结果转成八进制数,计算的结果为0x17
5)若有定义“int a=4b,则执行“b=a<<2后,b的结果是(  )。
A4              B8        C16            D32 
答案C
解析】对于移位运算,左移一位相当于原数乘以2,右移一位相当于原数除以2
6)运算符<<sizeof^&=按优先级由高到低的正确排列次序是(  )。
Asizeof&=<<^          Bsizeof<<^&=
C^<<sizeof&=          D<<^&=sizeof
答案B
解析】本题主要考查C语言运算符的优先级关系。
7)设有以下语句,则c的二进制数是  ),十进制数是  )。
char a=3b=6c
c=a^b<<2
①A00011011    B00010100    C00011100      D00011000
②A27      B20      C28        D24
答案A  A
解析】在一个表达式中出现^<<运算符时,应先计算<<再计算^
8)以下叙述中不正确的是(  )。
A.表达式“a&=b”等价于“a=a&b”  B.表达式“a|=b”等价于“a=a|b”
C.表达式“a!=b”等价于“a=a!B”    D.表达式“a^=b”等价于“a=a^b”
答案C
解析“a!=b”是一个关系表达式,不等价于“a=a!B”
9)以下运算符中优先级最高的是(  )。 
A~        B|          C&&      D*
答案D
解析】主要考查C语言运算符的优先级关系。
10)在位运算中运算量每右移动一位,其结果相当于( )。 
A.运算量乘以2        B.运算量除以2     
C.运算量除以4        D.运算量乘以4
答案B
解析】对于移位运算,左移一位相当于原数乘以2,右移一位相当于原数除以2
11)表达式“~0x13”的值是(  )。     
A0xFFEC      B0xFF71      C0xFF68          D0xFF17
答案A
运算符优先级按从高到低排列
解析0x13的二进制位为0000000000010011,按位取反后得111111*********0,对应的十六进制数为0xFFEC
12)请选择以下程序的执行结果。
  ),  ),  )。
#include <stdio.h>
main()
{
int  a=0234;
char  c =’A’;
printf(“ %o\n”,~a);
printf(“%o\n”, a&c);
        printf(“%o\n”,a|c);
    }
①A177543        B177      C175437    D17543
②A0            B1        C163      D24
③A35            B335      C53        D533
答案A  A  B
解析】本题主要考查位运算符的运算量类型和基本的位运算操作。
13)以下程序的运行结果是(  )。
#include <stdio.h>
main()
{
unsigned char a,b,c;
a=0x3;  b=a|0x8;  c=b<<1;
printf(“%d%d\n”,b,c );
}
A–1112      B–6 –13    C1224      D1122
答案D
解析a对应的二进制数为011,与0x8进行按位或运算后,b的值为1011,对应十进制数为11,左移一位相当于原数乘以2,故c的值为22
14)以下程序的运行结果是(  )。
#include <stdio.h>
void main()
{
char  x=040;
            printf("%o\n",x<<1);
}
A100        B80          C 64          D32
答案A
解析】八进制40左移一位后值变为十进制数64,对应的八进制数为100
15)整型变量xy的值相等,且为非0值,则以下选项结果为零的表达式是(  )。
Ax || y      Bx | y        Cx & y        Dx ^ y
答案D
解析】异或操作的运算规则为相同为零相异为1,故选D                                           
    2)填空题
1)位运算是对运算量的_____________位进行运算。
答案】二进制
2)位运算符只对__________________数据类型有效。
答案】整型  字符型
3)在6个位运算符中,只有_________是需要一个运算量的运算符。
答案~
4按位异或的运算规则是:________________________________________
答案】相同为零,相异为1
5C语言中的位运算符有_____________________>> <<6个。
答案&  |  ~  ^
6)以下程序段的输出结果是___________
int  x = -1
x= x | 0377
printf("%d,%x\n"xx )
答案-1ffffffff
7)设有一个整数a,若要通过异或运算“a^b”使a的高8位翻转,低8位不变,则b的八进制数形式是:_______
答案177400
8)设二进制数a00101101,若想通过异或运算“a^b”使a的高4位取反,低4位不变,则二进制数b应是_____________
答案11110000
9)设有一个整数a,若要通过“a&b”运算屏蔽掉a中的其他位,而只保留第2和第8位,则b的八进制数形式是__________________
答案202
10)如果想使一个数a的低4位全改为1,需要a____________进行按位或运算。
答案15
    3)编程题
1)设计一个函数。当给出一个数的原码时,能得到该数的补码。
【参考源程序】
#include <stdio.h>
int main()
{
    unsigned int a;
    unsigned int getbits(unsigned);
    printf(“\ninput an octal number:”);
    scanf(“%d”,&a);
    printf(“result:%o\n”,getbits(a));
    return 0;
}
unsigned int getbits(unsigned value)
{
    unsigned int z;
    z=value&0100000;
    if(z==0100000)
        z=~value+1;
    else
        z=value;
    return z;
}
2)编写一个函数,用它测定一个整数的最高位是0还是1,若是0,则输出正数,否则输出负数
【参考源程序】
#include <stdio.h>
int test(char);
int main()
{
    char a;
    printf(“please input a number:”);
    scanf(“%d”,&a);
    if(test(a))
        printf(“\npositive number”);
    else
        printf(“\nnegative”);
    return 0;
}
int test(char n)
{
    if(n&10000000)
        return 0;
    else
        return 1;
}
3)编写一个函数getbits(),从一个16位单元中取出某几位,即该几位保留原值,其余位为0,位数由输入者设定。
【参考源程序】
#include <stdio.h>
int getbits(unsigned value,int n1,int n2)
{
    unsigned int z;
    z=~0;
    z=(z>>n1)&(z<<(16-n2));
    z=value&z;
    z=z>>(16-n2);
    return z;
}
int main()
{
    unsigned int a;
    int n1,n2;
    printf(inpt an octal number;);
    scanf(“%o”,&a);
    printf(“input n1,n2:”);
    scanf(“%d%d”,&n1,&n2);
    printf(“result:%0\n”,getbits(a,n1,n2));