学习情境八
位运算习题解答
       
一、填空题
1.位运算是对运算量的        位进行运算。
【答案】二进制
2.位运算符只对                数据类型有效。
【答案】整型  字符型数据
3.位运算符连线:
~                按位异或
运算符优先级按从高到低排列
<<                按位与
&                按位取反
^              左移位
【答案】
4.在6个位运算符中,只有        是需要一个运算量的运算符。
【答案】取反~
5.按位异或的运算规则是       
【答案】0^0=00^1=11^0=11^1=0
6.C语言中,位运算符有                                >><<,共6个。
【答案】&  ~  |  ^
7.以下程序段的输出结果是       
int  x=-1;
x=x|0344;
printf("%d,%o\n",x,x);
【答案】-1,177777
【说明】x=-1以补码形式参加运算的,它转换为补码为:111111*********1,八进制数0344转换为二进制补码为:0000000011100100,两者进行或运算结果为111111*********1,转换为十进制数为-1,八进制数为177777
8.设有一个整数a,b;若要通过a^b运算,使a的高8位翻转,低8位不变,则b的八进制数是:       
【答案】177400
【说明】位异或运算中,特定位翻转方法:特定位与1异或;保留原值方法:与0异或。所以结果为二进制数1111111100000000,转换为八进制数为177400。
9.设二进制数a是00101101,若想通过异或运算a^b使a的高4位取反,低4位不变,则二进制数b应是        。 
【答案】11110000
【说明】位异或运算中,两个数的对应位相同时,得到的该位为0,不同时为1。要使a的高4位取反,即把0变为1,1变为0,所以对应位为0的应与1进行位异或运算,得到1;对应位为1的应与1进行位异或,得到0。所以b的高4位为1111,要使a的低4位不变,所以对应位为0的应与0进行位异或运算,得到0;对应位为1的应与0进行位异或运算,得到1。故b值应为11110000
10.设有一个整数a,b;若要通过a&b运算屏蔽掉a中的其他位,只保留第2和8位,则b的八进制数是       
【答案】404
【说明】位与运算中,0&0=00&1=01&0=01&1=1,所以只要把需保留第28位与1进行“按位与”操作,其余应屏蔽掉的位与0进行“按位与”操作,结果为0000000100000100(注:最低位为第0位),转换为八进制为000404
11.如果想使一个数a的低4位全改为1,需要a与        进行按位或运算。
【答案】15
【说明】位或运算中,对应位与1进行位或运算时,结果为1。所以低4位应为1111,转换为十进制数15。
二、选择题
1.以下运算符中优先级最低的是    ),以下运算符中优先级最高的是   
A.&&                B.&                C.||                  D.|
【答案】CB
2.表达式0x12&0x16的值是    。       
A.0x16                B.0x12            C.0xf8              D.0xec
【答案】B
【说明】0x12转换为二进制数为00010010,0x16转换为二进制数为00010110,两者进行位与运算,结果为00010010,转换为十六进制数为0x12。
3.若x=1,y=3,则x&y的结果是   
A.1                  B.2                C.3                  D.5
【答案】A
【说明】方法同上,先转换为二进制数后进行位与运算。
4.表达式0x12|0x16的值是    。       
A.0x16              B.0x12            C.0xf8              D.0xec
【答案】A
【说明】方法同上,只不过进行的是按位或运算。
5.设int  a=4,b;则执行b=a<<3;后,b的结果是    。 
A.4                  B.8                C.16                D.32
【答案】D
【说明】a每左移1位,相当于把a扩大2倍,a左移3位相当于,把a这个数扩大8倍,所以值为32。
6.若有运算符<<、sizeof、^、&=,则他们按优先级由高到低的正确排列次序是   
A.sizeof,&=,<<,^                        B.sizeof,<<,^,&=
C.^,<<,sizeof,&=                      D.<<,^,&=,sizeof
【答案】B
7.设有以下语句,则c的二进制数是    ),十进制数是   
char  a=3,b=5,c;
c=a^b<<3;
A.    00011011        B.    00010100          C.    00101011          D.    00011000
      27                        20                    43                        24
【答案】CC
【说明】a=3转换为二进制数为00000011,b=5转换为二进制数为00000101,因为“<<”的优先级比“^”的优先级高,所以b先进行左移运算后结果为00101000,两者再进行位异或运算结果为00101011,转换为十进制数为43。
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是一个关系表达式,不是赋值语句。
9.以下运算符中,优先级最高的是   
A.~                  B.|                  C.&&              D.*
【答案】A
10.在位运算中,运算量每右移动一位,其结果相当于    。 
A.运算量乘以2      B.运算量除以2      C.运算量除以4      D.运算量乘以4
【答案】B
11.表达式~0x12的值是   
A.0xFFED          B.0xFF71            C.0xFF68            D.0xFF17
【答案】A
【说明】0x12转换为二进制数为0000000000010010,取反后结果为111111*********1转换为十六进制数为:0xFFED。
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);
}
A.    177543            B.    177                C.    175437            D.    17543
      0                        1                      163                      24
      35                      335                      53                        533
【答案】A  A  B
【说明】a=0234转换为二进制数为0000000010011100,取反为111111*********1,转换为八进制数为177543c='A',其ASCII码为65,转换为二进制数为01000001a0000000010011100)和c0000000001000001)进行位与运算结果为0000000000000000,即八进制0,a和c进行位或运算结果为0000000011011101,转换为335。
13.有以下程序:
main()
{ unsigned char a,b,c;
  a=0x7;  b=a|0x4;  c=b<<1;
  printf("%d,%d\n",b,c);
}
程序运行后的输出结果是   
A.–11,12          B.–6,–13            C.7,14              D.11,22
【答案】C
【说明】a=0x7转换为二进制数00000111,与0x4(即二进制数00000100)进行位或运算,结果为b=00000111(十进制数为7),再把b左移1位结果为00001110(十进制数为14)。
14.以下程序的输出结果是   
main()
{ char  x=020;
  printf("%o\n",x<<2);
}
A.100                B.80                C.64                D.32
【答案】A
【说明】八进制数020(二进制数为010000),进行位左移运算,左移2位结果为1000000转换为八进制数为100
15.整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是   
A.x||y              B.x|y                C.x&y              D.x^y
【答案】D
【说明】异域运算中,相应位相同时为0,所以选D。
16.设char型变量x中的值为10100111,则表达式(8+x)^(~3)的值是   
A.10101001          B.10101000          C.11111101          D.01010011
【答案】D
【说明】8转换为二进制数为000010003转换为进制数为00000011,取反为111111008+x结果为10101111,再与(~3)进行位异或运算得01010011。
三、编程题
1.设计一个函数。当给出一个数的原码,能得到该数的补码。
【分析】首先,我们要判断输入的原码是正数还是负数;如果是正数,则补码和原码相同;如果是负数,我们必须先把原码的符号位改为0,再对这个数进行取反加1,这样我们就可以得到该数的补码。
要把原码的符号位改为0,只需把该原码与0x7fff进行按位与运算。
要判断原码是正数还是负数,只需判断最高位是否为1,即把原码与0x8000进行位与运算,判断结果是否为0x8000,如相等则表明该数为负数。
【源程序】
unsigned int buma(unsigned int yuanma)
{ unsigned int a;
  a=yuanma&0x8000;
  if(a==0x8000)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。