#bitop1. 位运算专项练习
位运算专项练习
位运算专项练习
一、选择题(每题 2 分)
- 整数 -5 的 16 位补码表示为( )
{{ select(1) }}
- FFFD
- FFFC
- FFFA
- FFFB
- 16 位短整数 -2 的十六进制表示为 FFFE,则 -4 的十六进制表示为( )
{{ select(2) }}
- FFFD
- FFFE
- FFFC
- FFFA
- 执行
cout << (3 | 16);的输出是( )
{{ select(3) }}
- 3
- 16
- 19
- 48
- 已知
int x = -5;,执行cout << (x == (x << 1 >> 1));的输出是( )
{{ select(4) }}
- 0
- 1
- -5
- 程序运行错误
- 下面说法正确的是( )
{{ select(5) }}
- (22 & 01) == (22 && 01) 成立
- (23 | 11) == 30
- (23 | 10) == 31
- (23 | 01) == 31
- 下列说法正确的是( )
{{ select(6) }}
- 2>>1 和 1>>1 的值是一样的
- (2>>2) 和 (1>>1) 的值是一样的
- (11^00) 和 (1^0) 的值是一样的
- ~0 的输出值是 1
- 下列代码实现的是( )
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}
{{ select(7) }}
- a 和 b 的异或
- a 和 b 的同或
- a 和 b 的值交换
- a 和 b 的高低位互换
a & ~1运算实现的是( )
{{ select(8) }}
- 使 a 的最低位为 1
- 使 a 的最高位为 1
- 使 a 的最低位为 0
- 使 a 的最高位为 0
- 已知 a = 1010 1110,对 a 执行
a << 2( )
{{ select(9) }}
- a 的值变为 1011 1000
- a 的值变为 1011 1010
- a 的值变为 0101 1101
- a 的值变为 0101 1100
- 下列二进制表示的十进制数值分别是( ):
[10000011]原 = ( ),[10000011]补 = ( )
{{ select(10) }}
- -125, -3
- -3, -125
- -3, -3
- -125, -125
- 关于计算机中的编码,下列说法中错误的是( )
{{ select(11) }}
- 对于无符号数,原码就是真值
- 正数的反码是其本身
- 负数的反码和补码是不一样的
- 负数的反码,在其原码的基础上,各个位取反
- 下面逻辑运算中,正确的是( )
{{ select(12) }}
- 5^3 == 0
- 5|3 == 8
- 5||3 == 11
- 5&3 == 0001
- 补码 11111101 进行
>>1运算以后得到的结果是( )
{{ select(13) }}
- 11111100
- -2
- 11111101
- 11111010
a | 10(a 与 10 都是十进制数,且 a 的二进制表示最高位为 1)运算的结果是( )
{{ select(14) }}
- 使 a 的二进制表示从右往左的第二位为 1
- 使 a 的二进制表示从右往左的第一位为 0
- 使 a 的二进制表示从右往左的第二位为 0
- 使 a 的二进制表示最高位为 0
- 8 位二进制原码能表示的最小整数是( )
{{ select(15) }}
- -127
- -128
- -255
- -256
- 反码表示中,零的表示形式有( )
{{ select(16) }}
- 1 种
- 2 种
- 8 种
- 16 种
- 补码 1011 1011 对应的真值是( )
{{ select(17) }}
- -69
- -59
- -68
- -58
- 若 X 的 8 位补码为 0000 1010,则 X/2 的补码是( )
{{ select(18) }}
- 0000 0101
- 1000 0101
- 0000 0101 或 1000 0101
- 算术右移后结果取决于符号位
- 二进制数 1010 与 1100 按位或的结果是( )
{{ select(19) }}
- 0110
- 1110
- 1010
- 1100
- 用位运算交换两个变量 a、b 的值,下列做法正确的是( )
{{ select(20) }}
- a=a^b; b=a^b; a=a^b
- a=a&b; b=a&b; a=a&b
- a=a|b; b=a|b; a=a|b
- a=a<<b; b=a<<b; a=a<<b
- 二进制数 11101110010111 与 01011011101011 进行逻辑与运算的结果是( )
{{ select(21) }}
- 01 0010 1000 1011
- 01 0010 1001 0011
- 01 0010 1000 0001
- 01 0010 1000 0011
- 32 位 int 类型的存储范围是( )
{{ select(22) }}
- -2147483647 ~ +2147483647
- -2147483647 ~ +2147483648
- -2147483648 ~ +2147483647
- -2147483648 ~ +2147483648
- 计算 (14₈ − 1010₂) × D₁₆ − 1101₂ 的结果,并选择答案的十进制值( )
{{ select(23) }}
- 13
- 14
- 15
- 16
- 计算机中,有符号整数常用补码表示,变量 x、y、z 中分别存储着 FA(16)、F6(16)、7F(16),他们的大小关系应该是( )
{{ select(24) }}
- x > y > z
- x > z > y
- z > y > x
- z > x > y
二、判断题(每题 2 分)
- 任意整数 a 的反码与补码都有 1 位不同。( )
{{ select(25) }}
- 正确
- 错误
- 执行
a << 2将把 2 输出到 a 中。( )
{{ select(26) }}
- 正确
- 错误
- 表达式
(a << 2 >> 2)运算后的值一定是 a。( )
{{ select(27) }}
- 正确
- 错误
- 表达式
(010 << 1)的执行结果是 100。( )
{{ select(28) }}
- 正确
- 错误
- 整数 -6 的 16 位补码是 FFFA。( )
{{ select(29) }}
- 正确
- 错误
- 补码的优点是可以将减法运算转化为加法运算,从而简化硬件设计。( )
{{ select(30) }}
- 正确
- 错误
三、程序阅读
程序一
#include <stdio.h>
int n;
int a[1000]; // 存放 1000 个整数,下标 0~999
int f(int x) { // 统计 x 对应二进制中 1 的个数
int ret = 0;
for (; x; x &= x - 1) ret++;
return ret;
}
int g(int x) { // 返回 x 最低位的 1 对应的数(lowbit)
return x & -x;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++)
printf("%d ", f(a[i]) + g(a[i]));
printf("\n");
return 0;
}
判断题
- 输入的 n 等于 1001 时,程序不会发生下标越界。( )
{{ select(31) }}
- 正确
- 错误
- 输入的 a[i] 必须全为正整数,否则程序将陷入死循环。( )
{{ select(32) }}
- 正确
- 错误
- 当输入为 "5 2 11 9 16 10" 时,输出为 "3 4 3 17 5"。( )
{{ select(33) }}
- 正确
- 错误
- 当输入为 "1 511998" 时,输出为 "18"。( )
{{ select(34) }}
- 正确
- 错误
- 将源代码中 g 函数的定义移到 main 函数的后面,程序可以正常编译运行。( )
{{ select(35) }}
- 正确
- 错误
单选题
- 当输入为 "2 -65536 2147483647" 时,输出为( )
{{ select(36) }}
- 65532 33
- 65552 32
- 65535 34
- 65554 33
程序二
假设输入的 x、y 均是不超过 15 的自然数。
#include <iostream>
using namespace std;
int main() {
unsigned short x, y;
cin >> x >> y;
x = (x | x << 2) & 0x33;
x = (x | x << 1) & 0x55;
y = (y | y << 2) & 0x33;
y = (y | y << 1) & 0x55;
unsigned short z = x | y << 1;
cout << z << endl;
return 0;
}
判断题
- 删去第 7 行与第 13 行的
unsigned,程序行为不变。( )
{{ select(37) }}
- 正确
- 错误
- 将第 7 行与第 13 行的
short均改为char,程序行为不变。( )
{{ select(38) }}
- 正确
- 错误
- 程序总是输出一个整数 "0"。( )
{{ select(39) }}
- 正确
- 错误
- 当输入为 "2 2" 时,输出为 "10"。( )
{{ select(40) }}
- 正确
- 错误
- 当输入为 "2 2" 时,输出为 "59"。( )
{{ select(41) }}
- 正确
- 错误
单选题
- 当输入为 "13 8" 时,输出为( )
{{ select(42) }}
- 0
- 209
- 197
- 226