为何在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 << n的写法,能直接让阅读代码的人明白这是2的n次方,不需要反向推导数值对应的指数。比如1 << 10一眼就知道是2^10,而1024可能还要反应几秒;对于大数1 << 30,比1073741824直观太多,能瞬间get到代码的设计意图。避免手动计算错误:手动计算2的高次幂很容易出错,比如把2^20的1048576写成1048575或者多写一位数字。用左移运算符的话,只要指数n是对的,编译器会在编译期自动计算出正确结果,完全不会有手算失误的问题。
维护成本更低:如果后续需要调整数组元素,比如新增
1 << 31(只要类型支持),或者把某个元素从1 << 5改成1 << 6,直接修改指数即可,不用重新计算对应的数值,大幅降低维护时的出错概率。无性能损失:这些左移操作属于编译期常量表达式,编译器会提前计算出最终的常量值,生成的二进制代码和直接写常量数组完全一致,不会带来任何运行时的性能开销。
内容的提问来源于stack exchange,提问作者james dilaw
相关产品推荐
相关产品推荐

