You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在C++数组声明中使用左移运算符(<<)?

问题:为何使用左移运算符初始化幂次数组?

我在一款用于读取CSV数据、比较元组并输出最优元组的开源软件中,发现了这样的数组声明:

static const uint32_t SHIFTS[] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4,
1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13,
1 << 14, 1 << 15, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 21,
1 << 22, 1 << 23, 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30 };

我推测这个SHIFTS[]数组用于数据分区,也知道左移运算符<<的作用:x << y等价于x乘以2的y次方,所以这个数组完全可以直接用常量值初始化:

static const uint32_t SHIFTS[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216,
33554432, 67108864, 134217728, 268435456, 536870912, 1073741824};

我已经算出了左移后的数组值,但还是不理解为什么要在数组声明中使用左移运算符?


回答
  1. 可读性与意图更清晰:用1 << n的写法,能直接让阅读代码的人明白这是2的n次方,不需要反向推导数值对应的指数。比如1 << 10一眼就知道是2^10,而1024可能还要反应几秒;对于大数1 << 30,比1073741824直观太多,能瞬间get到代码的设计意图。

  2. 避免手动计算错误:手动计算2的高次幂很容易出错,比如把2^20的1048576写成1048575或者多写一位数字。用左移运算符的话,只要指数n是对的,编译器会在编译期自动计算出正确结果,完全不会有手算失误的问题。

  3. 维护成本更低:如果后续需要调整数组元素,比如新增1 << 31(只要类型支持),或者把某个元素从1 << 5改成1 << 6,直接修改指数即可,不用重新计算对应的数值,大幅降低维护时的出错概率。

  4. 无性能损失:这些左移操作属于编译期常量表达式,编译器会提前计算出最终的常量值,生成的二进制代码和直接写常量数组完全一致,不会带来任何运行时的性能开销。


内容的提问来源于stack exchange,提问作者james dilaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:20:41