【考点 · 5级】位移运算:左移 << 和右移 >>,属于位运算类,是二进制层面的操作。
【说人话】
左移 n << k 就是把 n 的二进制位往左搬 k 位,右边补 0,效果等于 n × 2k。右移 n >> k 就是往右搬 k 位,左边补符号位(算术右移),效果等于 n ÷ 2k(向下取整)。
核心要点:
n << k 等价于 n * (1 << k),等价于 n * pow(2, k)n >> k 等价于 n / (1 << k)(整数除法,自动向下取整)n << 32 对 32 位 int 未定义行为,要小心移位量超过类型位宽8 >> 2 的结果是?1 << 5 的结果是?15 >> 1 的结果是?(1 << k) 计算并输出 2k(k 从 0 到 9)1 << k 就是 2k。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入一个正整数
cout << "n << 1 = " << (n << 1) << endl; // 左移1位 = n*2
cout << "n >> 2 = " << (n >> 2) << endl; // 右移2位 = n/4向下取整
for (int k = 0; k <= 9; k++) { // 遍历 k=0~9
cout << "2^" << k << " = " << (1 << k) << endl; // 1左移k位
}
return 0;
}
1 << k 是快速算 2k 的标准写法。
int 是 32 位,n << 32 是 UB,必须确保移位量 < 32n << 1 + 2 等价于 n << (1+2) 因为 + 优先级高于 <<,但建议加括号避免歧义n*2 → n<<1,代码可读性优先