ARTICLE · 1107838
2026年9月GESP三级C++真题解析:位运算专项,3道高频题彻底搞懂!
2026年9月份 GESP 三级 C++真题 位运算专项习题解析,汇集多道高频真题,覆盖位运算全部核心考点:运算符优先级、
x&(x‑1)统计二进制 1 的个数、异或的多种应用(找唯一数、异或加密)、位掩码权限管理、移位运算、按位取反、有符号 / 无符号数溢出、负数补码运算、奇偶判断等。
一、第5题
下面程序执行的结果是()。
#include<iostream>usingnamespacestd;intmain(){int x = 2026;int count = 0;while (x > 0) { count++; x = x & (x - 1); }cout << count << endl;}A. 2026
B. 8
C. 16
D. 32
答案:B
详细题解
核心知识点
x = x & (x - 1) 是位运算经典技巧: 每次运算会把x二进制里最右边的一个1变成0。
循环每执行一次,count就+1,直到x变成0循环结束。
👉 所以count最终的值 = 数字2026的二进制中,1的个数。
步骤1:把2026转为二进制
写出二进制:1 1 1 1 1 1 0 1 0 1 0
步骤2:数里面1的数量
1 1 1 1 1 1 0 1 0 1 0数一下:1、1、1、1、1、1、1、1 一共8个1。
步骤3:模拟循环过程验证
,count=1,,消掉最右侧1 新值,count=2,继续消掉最右侧1 重复,每一轮消去1个二进制的1 ……
循环一共执行8次,count=8;当全部的1都变成0,,退出循环。
结论
程序输出8,选B。
补充考点(GESP常考)
作用: x & (x-1)统计二进制中1的个数;也可以用来判断是不是2的幂(若x&(x-1)==0,x是2的幂)原理简述:会把x最右边的1变成0,它右边所有0全部变成1; &运算后,这一位直接清零,高位不变。
例:x=6(0110),x-1=5(0101),x&(x-1)=0100,最右边的1被清除。
二、第6题
关于位运算,下列说法错误的是()。
A. 找唯一数:数组中唯一出现一次的数,其余出现两次,全部异或结果即为该数。例子:数组 (唯一数是 9)
B. 若左移导致高位溢出(如超过整型范围),结果不再符合乘法规律。
C. 有符号整数左移溢出时结果确定。
D. 位二进制数 ,一定是 4 的倍数(最后两位 00是二进制的 00)。
答案:C
详细题解
选项A ✅ 正确
异或性质:,。 相同数字异或抵消为0,最后剩下只出现一次的数字。 数组 。
这是GESP/C++经典「只出现一次的数字」算法。
选项B ✅ 正确
正常没有溢出时,左移1位等价 ,左移位等价乘以。
一旦高位溢出,超出类型存储范围,高位直接丢弃,结果不再满足乘以的数学关系,乘法规律失效。
选项C ❌ 错误
C++标准规定:有符号整数发生左移溢出,属于未定义行为(Undefined Behavior)。
未定义行为代表:不同编译器、不同运行环境,得到的结果可能不一样,结果是不确定的。
所以“结果确定”这句话描述错误,本选项就是答案。
补充区分:无符号整数溢出是取模,行为确定;有符号整数溢出(左移/加法溢出)都是未定义。
选项D ✅ 正确
二进制末尾两位是00,代表该数可以写成 ,一定能被4整除,是4的倍数。
例:二进制10100,末尾00,等于十进制20,。
考点小结(GESP三级常考)
异或的性质,寻找数组唯一数; 移位运算:区分有符号数溢出(未定义、结果不确定) 和无符号数溢出(行为确定); 二进制末尾位为0,能被整除。
三、第7题
计算表达式:()。(C++位运算)
注:题目里
^是按位异或,~是按位取反,&按位与,|按位或。 位运算优先级:~最高 >&>|>^
A. -9 B. -1 C. -7 D. -5
答案:D
详细题解
步骤1:写出各数二进制(int,简化,先看低4位)
步骤2:按优先级分步计算
先算
~11:按位取反,十进制 (补码表示)计算
3 & 7按位与
00110111----0011 = 3现在式子简化为:
优先级:
|高于^,先算
00111111----1111 = 15最后:,按位异或::异或:,补码,对应原码: 十进制 -5
汇总计算全过程
考点总结(GESP)
C++位运算符优先级 ~(按位取反,单目)>&>|>^
口诀:取反 > 与 > 或 > 异或
~按位取反是单目运算符,对整数全部二进制位翻转,包含符号位,结果一定是负数(正数取反)。负数在计算机中以补码存储,异或运算直接对补码的每一位运算。
易错坑:很多同学误以为
^优先级比|高,顺序算错,结果就错。