GESP三级真题汇总 – 位运算

2025年6月

选择题

第8题

二进制数 1010 ^ 1100的结果是()

A. 1000
B. 0110
C. 1010
D. 1100

第9题

以下哪个位运算可以交换两个变量的值(无需临时变量)()

A. a = a ^ b; b = a ^ b; a = a ^ b;
B. a = a & b; b = a & b; a = a & b;
C. a = a | b; b = a ^ b; a = a ^ b;
D. a = ~a; b = ~b; a = ~a;

判断题

第6题

(x&1)==0可以判断整数x是否为偶数。

编程题

第1题

奇偶校验

给定n个非负整数,它们的校验码取决于这些整数在二进制下1的数量之和的奇偶性。如果这些整数在二进制下共有奇数个1,那么校验码为1;否则校验码为0。你能求出这些整数的校验码吗?

核心思路:
遍历n个整数,对每个整数c,使用循环 `while(c)`,在循环内通过 `c & 1` 判断最低位是否为1并累加,然后通过 `c >>= 1` 将c右移一位,直到c变为0。最后根据1的总数的奇偶性输出校验码。

样例输入 1:
4
71 69 83 80
样例输出 1:
13 1
样例输入 2:
6
1 2 4 8 16 32
样例输出 2:
6 0

2025年3月

选择题

第10题

以下代码的说法正确的是什么()


#include <iostream>
using namespace std;
int main() {
    int a = 0b1101;
    int b = 0b1011;
    cout << (a ^ b);
    return 0;
}
A. 进行的是整体异或运算
B. 进行的是按位同或运算
C. 进行的是按位与运算
D. 进行的是按位异或运算

判断题

第2题

这段程序进行的是判断一个从键盘输入的字符的ASCII是否是奇数,若是,输出YES,否则,输出 NO


int main()
{
    char x;
    scanf("%c", &x);
    int ASCII = (int)x;
    cout << (x & 1 ? "YES": "NO") << '\n';
    return 0;
}

编程题

第1题

2025

小x有一个整数x,他想找到最小的正整数y,使得下式成立: (x and y) + (x or y) = 2025。其中 and 表示二进制按位与运算,or表示二进制按位或运算。如果不存在满足条件的y,则输出-1。

核心思路:
利用位运算的重要性质 `(x & y) + (x | y)` 等价于 `x + y`。所以题目简化为求解 `x + y = 2025`,即 `y = 2025 – x`。注意题目要求y是正整数。

样例输入 1:
1025
样例输出 1:
1000

2024年9月

选择题

第5题

下面说法正确的是()

A. (22&01) == (22&&01)成立
B. (23|11) == 30
C. (23|10) == 31
D. (23|01) == 31

第6题

下列说法正确的是()

A. 2>>1和1>>1的值是一样的
B. (2>>2)和(1>>1)的值是一样的
C. (11^00)和(1^0)的值是一样的
D. (~0的输出值是1)

第7题

下列代码实现的是()


void Swap(int &a, int &b) {
    if (a != b) {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}
A. a和b的异或
B. a和b的同或
C. a和b的值交换
D. a和b的高低位互换

第8题

a&~1运算实现的是()。

A. 使a的最低位为1
B. 使a的最高位为1
C. 使a的最低位为0
D. 使a的最高位为0

第9题

a=1010 1110, a<<2,下面关于这个说法正确的是()。

A. a的值变为1011 1000
B. a的值变为1011 1010
C. a的值变为0101 1101
D. a的值变为0101 1100

第10题

下列程序中,result和result2输出分别是()


long a = 123;
int b = 1;
long result = a & b;
cout<<result<<endl;

long a2= -123;
unsigned int b2=-1;
long result2 = a2 & b2;
cout<<result2<<endl;
A. 1 23-1
B. 1 23-123
C. 1 -1
D. 1 -123

判断题

第2题

~1的输出值是-2。()

第3题

~1 = 1111 1110。()

第4题

取X的低四位,可以用Y = 0000 1111,用X&Y获取X的低四位。()

2024年6月

选择题

第7题

下列代码的输出结果是()。


#include <iostream>
using namespace std;
int main() {
    int a = 12;
    int result = a >> 2;
    cout << result << endl;
    return 0;
}
A. 12
B. 6
C. 3
D. 1

第8题

下列代码的输出结果是()。


#include <iostream>
using namespace std;
int main() {
    int a = 5;
    int b = 10;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    cout << "a=" << a << ", b = " << b << endl;
    return 0;
}
A. a=5, b=10
B. a=5, b=5
C. a=10, b=5
D. a=10, b=10

判断题

第7题

如果a为int类型的变量,且表达式 ((a|3)==3) 的值为true,则说明a在从0到3之间(可能为0、可能为3)。

第8题

执行下面C++代码后,输出的结果是8。


int a = 0b1010;
int b = 0b1100;
int c = a & b;
cout << c <<endl;

2024年3月

选择题

第4题

定义整数 int x=-5,则执行C++代码 cout << (x == (x<<1>>1))输出是( )。

A. 0
B. 1
C. -5
D. 5

判断题

第2题

对整型变量 int a = 3, 执行C++代码a<<2将把2输出到a中。( )

第4题

一个int类型变量a,执行操作(a<<2>>2)后的值一定是a。()

第5题

在C++语言中,(010<<1)执行结果是100。()

2023年9月

选择题

第10题

如果a是int类型的变量,下列哪个表达式的值一定为true? ()

A. a + 1000 – 1000 == a
B. a * 2 / 2 == a
C. (a ^ a | 1) == 1
D. (a | 1) == a + 1

第11题

如果a和b均为int类型的变量,下列表达式不能正确判断“a等于b”的是()。

A. ((a>=b) && (a<=b))
B. ((a>>1)==(b>>1))
C. ((a+b)==(a+a))
D. ((a^b)==0)

第13题

在下列代码的横线处填写(),可以使得输出是“20 10”。


int main() {
    int a=10, b=20;
    a = (a<<8) | b;
    // 在此处填入代码
    cout << a << " " << b << endl;
    return 0;
}
A. b=a>>8; a=a & 0xff;
B. a=a>>8; b=a & 0xff;
C. a=b; b=a & 0xff;
D. b=a; a=b;

判断题

第2题

在C++语言中,位运算符也有类似“先乘除、后加减”的优先级规则。因此,使用时应注意合理使用括号。

第10题

如果a为int类型的变量,且表达式((a&1)==0)的值为true,则说明a是偶数。

2023年6月

选择题

第10题

一个int类型的值,做以下哪个操作,一定会变回原来的值? ( )

A. 左移3位,再右移3位。
B. 右移3位,再左移3位。
C. 按位或7,再按位与-8。
D. 按位异或7,再按位异或7。

第11题

如果a和b均为int类型的变量,下列表达式能正确判断“a等于b”的是()。

A. ((a/b)==1)
B. ((a&b)==a)
C. ((a^b)==0)
D. ((a|b)==b)

第12题

如果a为int类型的变量,下列哪个表达式可以正确求出满足“小于等于a且是4的倍数”的整数中最大的?( )

A. (a & (~3))
B. ((a<<2)>>2)
C. (a^3)
D. ((a-1)|3)+1

第13题

在下列代码的横线处填写(),可以使得输出是“24 12”。


int main() {
    int a=12, b=24;
    //在此处填入代码
    a=a^b;
    b=a^b;
    cout << a << " " << b << endl;
    return 0;
}
A. a = a ^ b;
B. b = a ^ b;
C. a = a + b;
D. b = a + b;

第15题

在下列代码的横线处填写(),可以使得输出不是“31”。


int array [5] = {1,2,4,8,16};
int res = 0;
for (int i=0; i < 5; i++)
    //在此处填写代码
cout << res << endl;
A. res = res + array[i]
B. res = res & array[i]
C. res = res | array[i]
D. res = res ^ array[i]

判断题

第10题

如果a为int类型的变量,且表达式((a | 3) == 3)的值为true,则说明a在从0到3之间(可能为0、可能为3)。