夜雨聆风学习资料网

ARTICLE · 1107838

2026年9月GESP三级C++真题解析:位运算专项,3道高频题彻底搞懂!

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:模拟循环过程验证

  1. ,count=1,,消掉最右侧1
  2. 新值,count=2,继续消掉最右侧1
  3. 重复,每一轮消去1个二进制的1 ……

循环一共执行8次,count=8;当全部的1都变成0,,退出循环。

结论

程序输出8,选B。

补充考点(GESP常考)

  1. 作用:x & (x-1) 统计二进制中1的个数;也可以用来判断是不是2的幂(若x&(x-1)==0,x是2的幂)
  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三级常考)

  1. 异或的性质,寻找数组唯一数;
  2. 移位运算:区分有符号数溢出(未定义、结果不确定) 和无符号数溢出(行为确定);
  3. 二进制末尾位为0,能被整除。

三、第7题

计算表达式:()。(C++位运算)

注:题目里 ^ 是按位异或,~ 是按位取反,&按位与,|按位或。 位运算优先级:~ 最高 > & > | > ^

A. -9 B. -1 C. -7 D. -5

答案:D

详细题解

步骤1:写出各数二进制(int,简化,先看低4位)

步骤2:按优先级分步计算

  1. 先算 ~11:按位取反,十进制 (补码表示)

  2. 计算 3 & 7 按位与

00110111----0011 = 3
  1. 现在式子简化为:

优先级:| 高于 ^,先算 

00111111----1111 = 15
  1. 最后:,按位异或::异或:,补码,对应原码: 十进制 -5

汇总计算全过程

考点总结(GESP)

  1. C++位运算符优先级~(按位取反,单目)> & > | > ^

口诀:取反 > 与 > 或 > 异或

  1. ~ 按位取反是单目运算符,对整数全部二进制位翻转,包含符号位,结果一定是负数(正数取反)。
  2. 负数在计算机中以补码存储,异或运算直接对补码的每一位运算。

易错坑:很多同学误以为^优先级比|高,顺序算错,结果就错。

相关学习资料