#bitop1. 位运算专项练习

位运算专项练习

位运算专项练习

一、选择题(每题 2 分)

  1. 整数 -5 的 16 位补码表示为( )

{{ select(1) }}

  • FFFD
  • FFFC
  • FFFA
  • FFFB
  1. 16 位短整数 -2 的十六进制表示为 FFFE,则 -4 的十六进制表示为( )

{{ select(2) }}

  • FFFD
  • FFFE
  • FFFC
  • FFFA
  1. 执行 cout << (3 | 16); 的输出是( )

{{ select(3) }}

  • 3
  • 16
  • 19
  • 48
  1. 已知 int x = -5;,执行 cout << (x == (x << 1 >> 1)); 的输出是( )

{{ select(4) }}

  • 0
  • 1
  • -5
  • 程序运行错误
  1. 下面说法正确的是( )

{{ select(5) }}

  • (22 & 01) == (22 && 01) 成立
  • (23 | 11) == 30
  • (23 | 10) == 31
  • (23 | 01) == 31
  1. 下列说法正确的是( )

{{ select(6) }}

  • 2>>1 和 1>>1 的值是一样的
  • (2>>2) 和 (1>>1) 的值是一样的
  • (11^00) 和 (1^0) 的值是一样的
  • ~0 的输出值是 1
  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 的高低位互换
  1. a & ~1 运算实现的是( )

{{ select(8) }}

  • 使 a 的最低位为 1
  • 使 a 的最高位为 1
  • 使 a 的最低位为 0
  • 使 a 的最高位为 0
  1. 已知 a = 1010 1110,对 a 执行 a << 2( )

{{ select(9) }}

  • a 的值变为 1011 1000
  • a 的值变为 1011 1010
  • a 的值变为 0101 1101
  • a 的值变为 0101 1100
  1. 下列二进制表示的十进制数值分别是( ):[10000011]原 = ( ),[10000011]补 = ( )

{{ select(10) }}

  • -125, -3
  • -3, -125
  • -3, -3
  • -125, -125
  1. 关于计算机中的编码,下列说法中错误的是( )

{{ select(11) }}

  • 对于无符号数,原码就是真值
  • 正数的反码是其本身
  • 负数的反码和补码是不一样的
  • 负数的反码,在其原码的基础上,各个位取反
  1. 下面逻辑运算中,正确的是( )

{{ select(12) }}

  • 5^3 == 0
  • 5|3 == 8
  • 5||3 == 11
  • 5&3 == 0001
  1. 补码 11111101 进行 >>1 运算以后得到的结果是( )

{{ select(13) }}

  • 11111100
  • -2
  • 11111101
  • 11111010
  1. a | 10(a 与 10 都是十进制数,且 a 的二进制表示最高位为 1)运算的结果是( )

{{ select(14) }}

  • 使 a 的二进制表示从右往左的第二位为 1
  • 使 a 的二进制表示从右往左的第一位为 0
  • 使 a 的二进制表示从右往左的第二位为 0
  • 使 a 的二进制表示最高位为 0
  1. 8 位二进制原码能表示的最小整数是( )

{{ select(15) }}

  • -127
  • -128
  • -255
  • -256
  1. 反码表示中,零的表示形式有( )

{{ select(16) }}

  • 1 种
  • 2 种
  • 8 种
  • 16 种
  1. 补码 1011 1011 对应的真值是( )

{{ select(17) }}

  • -69
  • -59
  • -68
  • -58
  1. 若 X 的 8 位补码为 0000 1010,则 X/2 的补码是( )

{{ select(18) }}

  • 0000 0101
  • 1000 0101
  • 0000 0101 或 1000 0101
  • 算术右移后结果取决于符号位
  1. 二进制数 1010 与 1100 按位或的结果是( )

{{ select(19) }}

  • 0110
  • 1110
  • 1010
  • 1100
  1. 用位运算交换两个变量 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
  1. 二进制数 11101110010111 与 01011011101011 进行逻辑与运算的结果是( )

{{ select(21) }}

  • 01 0010 1000 1011
  • 01 0010 1001 0011
  • 01 0010 1000 0001
  • 01 0010 1000 0011
  1. 32 位 int 类型的存储范围是( )

{{ select(22) }}

  • -2147483647 ~ +2147483647
  • -2147483647 ~ +2147483648
  • -2147483648 ~ +2147483647
  • -2147483648 ~ +2147483648
  1. 计算 (14₈ − 1010₂) × D₁₆ − 1101₂ 的结果,并选择答案的十进制值( )

{{ select(23) }}

  • 13
  • 14
  • 15
  • 16
  1. 计算机中,有符号整数常用补码表示,变量 x、y、z 中分别存储着 FA(16)、F6(16)、7F(16),他们的大小关系应该是( )

{{ select(24) }}

  • x > y > z
  • x > z > y
  • z > y > x
  • z > x > y

二、判断题(每题 2 分)

  1. 任意整数 a 的反码与补码都有 1 位不同。( )

{{ select(25) }}

  • 正确
  • 错误
  1. 执行 a << 2 将把 2 输出到 a 中。( )

{{ select(26) }}

  • 正确
  • 错误
  1. 表达式 (a << 2 >> 2) 运算后的值一定是 a。( )

{{ select(27) }}

  • 正确
  • 错误
  1. 表达式 (010 << 1) 的执行结果是 100。( )

{{ select(28) }}

  • 正确
  • 错误
  1. 整数 -6 的 16 位补码是 FFFA。( )

{{ select(29) }}

  • 正确
  • 错误
  1. 补码的优点是可以将减法运算转化为加法运算,从而简化硬件设计。( )

{{ 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;
}

判断题

  1. 输入的 n 等于 1001 时,程序不会发生下标越界。( )

{{ select(31) }}

  • 正确
  • 错误
  1. 输入的 a[i] 必须全为正整数,否则程序将陷入死循环。( )

{{ select(32) }}

  • 正确
  • 错误
  1. 当输入为 "5 2 11 9 16 10" 时,输出为 "3 4 3 17 5"。( )

{{ select(33) }}

  • 正确
  • 错误
  1. 当输入为 "1 511998" 时,输出为 "18"。( )

{{ select(34) }}

  • 正确
  • 错误
  1. 将源代码中 g 函数的定义移到 main 函数的后面,程序可以正常编译运行。( )

{{ select(35) }}

  • 正确
  • 错误

单选题

  1. 当输入为 "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;
}

判断题

  1. 删去第 7 行与第 13 行的 unsigned,程序行为不变。( )

{{ select(37) }}

  • 正确
  • 错误
  1. 将第 7 行与第 13 行的 short 均改为 char,程序行为不变。( )

{{ select(38) }}

  • 正确
  • 错误
  1. 程序总是输出一个整数 "0"。( )

{{ select(39) }}

  • 正确
  • 错误
  1. 当输入为 "2 2" 时,输出为 "10"。( )

{{ select(40) }}

  • 正确
  • 错误
  1. 当输入为 "2 2" 时,输出为 "59"。( )

{{ select(41) }}

  • 正确
  • 错误

单选题

  1. 当输入为 "13 8" 时,输出为( )

{{ select(42) }}

  • 0
  • 209
  • 197
  • 226