左移右移与乘除运算性能对比及x*2、x/2最优实现咨询
移位运算与乘除法的性能对比及实现选择
核心结论
现代主流编译器会自动将乘/除以2的幂次这类操作优化为对应的移位指令,所以手写移位和直接写乘除,在最终生成的机器码层面性能几乎没有差异。
1. 计算x * 2的实现选择
无论是写x << 1还是x * 2,编译器都会把它转换成左移1位的机器指令——因为左移1位对无符号数或正整数来说,完全等价于乘2,编译器能直接识别这种数学等价关系并做优化。
从代码可读性角度,x * 2更直观,一眼就能理解是乘2操作;而x << 1需要读者额外反应其对应的数学含义,除非是为了明确表达“位操作”的意图,否则优先选x * 2。
2. 计算x / 2的实现选择
这里要分两种情况讨论:
- 无符号数场景:
x >> 1和x / 2完全等价,编译器会自动把x / 2优化为右移1位的指令,性能无差。 - 有符号数场景:
- 正整数时,两者等价,编译器同样会做优化,性能一致;
- 负整数时,
x >> 1是算术右移(高位补符号位),结果会向负无穷取整(比如(-3) >> 1得到-2);而x / 2在大多数编程语言中是向零取整(比如(-3) / 2得到-1),两者行为完全不同,这时候不能随意替换。
移位运算是否一定优于乘除法?
答案是否定的:
- 只有当乘/除的数是2的幂次时,移位和乘除才存在数学等价性,编译器也会自动做优化,此时两者性能完全相同;
- 如果乘/除的数不是2的幂次,移位根本无法替代乘除,自然不存在性能对比的前提;
- 就算是2的幂次场景,手写移位也不会比直接写乘除更快——因为编译器已经帮你做了优化,最终执行的是同一条机器指令。
内容的提问来源于stack exchange,提问作者holydragon
相关产品推荐
相关产品推荐

