GESP C++ 3 级 · 知识点

位运算

GESP C++ 三级要求掌握与、或、非、异或、左移、右移六种位运算的含义与计算过程。位运算按二进制位独立计算,理解这一点后,判奇偶、取某一位、交换变量这些用法都能自己推出来。

对应知识域:位运算(与 &、或 |、非 ~、异或 ^、左移 <<、右移 >>)相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 理解按位与 &、按位或 |、按位取反 ~、按位异或 ^ 是逐位运算,每一位独立计算。
  • 掌握左移 << 与右移 >> 的效果:左移 k 位相当于乘以 2 的 k 次方,非负整数右移 k 位相当于整除 2 的 k 次方。
  • 会利用与运算判断某一位是否为 1,例如 x & 1 判断奇偶。
  • 会利用异或的性质完成交换两个数、找只出现一次的数等基础应用。

典型题型

  • 给出两个整数,要求写出按位与、按位或、按位异或的结果。
  • 判断 x 左移 2 位是否等价于 x 乘以 4。
  • 用位运算实现判断奇偶或取出二进制第 k 位。

常见错误

  • 把位运算与逻辑运算混用,把 a & b 当成逻辑与。逻辑与写作 &&,结果是真或假。
  • 以为右移对负数也等于整除。负数右移的具体行为与实现有关,应避免依赖。
  • 以为 ~x 等于 -x。取反是把每一位翻转,x 与其取反值满足 x + ~x 等于 -1。
  • 左移导致溢出,越界的位被丢弃,结果不再等于乘以 2 的幂。

深入理解

六种运算按位独立计算

  • & 与:两位都是 1 结果才是 1。
  • | 或:两位有一个是 1 结果就是 1。
  • ^ 异或:两位不同结果是 1,相同是 0。
  • ~ 非:逐位取反,一位一元运算。
  • << 左移:整体往左挪 n 位,低位补 0,相当于乘 2ⁿ。
  • >> 右移:整体往右挪 n 位,相当于除以 2ⁿ 并向下取整。

「按位独立」意味着没有任何进位和借位,所以每一步都可以单独算。例如 6 & 3:110 & 011 = 010,结果是 2。写的时候把两个数上下对齐、逐列运算,比心算可靠。

四个能自己推出来的用法

理解原理后,这些技巧不需要背:

  • 判断奇偶:x & 1,末位是 1 就是奇数。因为二进制末位就是 2⁰ 位。
  • 取第 k 位:(x >> k) & 1,右移到最低位再取出。
  • 把第 k 位置 1:x | (1 << k),用或运算不影响其他位。
  • 把第 k 位清 0:x & ~(1 << k),先构造出只有第 k 位是 0 的掩码。

异或还有一个经典用法是不借助临时变量交换两个数:a ^= b; b ^= a; a ^= b;。原理是「同一个数异或两次会还原」,了解即可,实际编程仍推荐用临时变量。

移位与溢出的边界

左移 n 位等价于乘以 2ⁿ,但当结果超出类型的表示范围时会丢高位。8 位里 127 << 1 得到的是 -2,因为最高位的 1 被当成了符号位。移位不会自动扩展宽度,这一点在题目里常表现为「移位后结果变成负数」。

右移分算术右移和逻辑右移:对有符号数,多数实现采用算术右移,高位补符号位,所以负数右移保持负数;对无符号数,高位一律补 0。一级二级的程序里一般只处理正数,不容易撞上这个差别,但题目若给出负数移位,务必先想清楚补的是 0 还是 1。

自编例题

位运算的两个常见用法

不借助临时变量交换两个整数,并用与运算判断一个数的奇偶。

int a = 5, b = 9;
a ^= b; b ^= a; a ^= b;   // 交换后 a = 9, b = 5
if ((a & 1) == 0) cout << "even" << endl;
else cout << "odd" << endl;

异或满足交换律和自反性:x 异或 x 等于 0,x 异或 0 等于 x。连续三次异或后 a 与 b 的值互换,且不需要额外变量。整数的最低位决定奇偶,a & 1 只保留最低位,结果为 1 是奇数、为 0 是偶数。这种写法在考试中主要考查运算过程,实际工程里用临时变量交换更易读。另外要注意运算符优先级,位运算通常低于比较运算,需要加括号。

相关真题

这块内容在整条路线里的位置:GESP C++ 3 级备考路径。

READY TO START

开始练习

先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。

常见问题

& 和 && 有什么区别?

& 是按位与,对两个整数的每一位分别计算;&& 是逻辑与,判断两个条件是否同时为真,结果只有真或假。

异或有什么常见用途?

可以交换两个数、判断两个数是否相等、找出一组数中只出现一次的那个数,因为相同值异或为 0、任何值与 0 异或不变。

左移右移的优先级高吗?

移位运算的优先级低于加减、高于比较。混合表达式容易看错,最好用括号明确计算顺序。

本级别其他知识点

官方依据