学习情境八
位运算习题解答
一、填空题
1.位运算是对运算量的 位进行运算。
【答案】二进制
2.位运算符只对 和 数据类型有效。
【答案】整型 字符型数据
3.位运算符连线:
~ 按位异或
运算符优先级按从高到低排列<< 按位与
& 按位取反
^ 左移位
【答案】
4.在6个位运算符中,只有 是需要一个运算量的运算符。
【答案】取反~
5.按位异或的运算规则是 。
【答案】0^0=0,0^1=1,1^0=1,1^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=0,0&1=0,1&0=0,1&1=1,所以只要把需保留第2和8位与1进行“按位与”操作,其余应屏蔽掉的位与0进行“按位与”操作,结果为0000000100000100(注:最低位为第0位),转换为八进制为000404。
11.如果想使一个数a的低4位全改为1,需要a与 进行按位或运算。
【答案】15
【说明】位或运算中,对应位与1进行位或运算时,结果为1。所以低4位应为1111,转换为十进制数15。
二、选择题
1.以下运算符中优先级最低的是( ),以下运算符中优先级最高的是( )。
A.&& B.& C.|| D.|
【答案】C、B
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
【答案】C、C
【说明】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,转换为八进制数为177543,c='A',其ASCII码为65,转换为二进制数为01000001,a(0000000010011100)和c(0000000001000001)进行位与运算结果为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转换为二进制数为00001000,3转换为进制数为00000011,取反为11111100,8+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小时内删除。
发表评论