移位 1 和乘法 vs 直接移位
Shift 1 and multiply vs direct shift
中遇到了类似的代码
int32_t val, shift;
// code that initializes val and shift
int32_t result = val * (1 << shift);
旨在将 val
乘以某个二值的幂 x
,其中 shift
是指数,即 x=pow(2,shift)
。为什么他们不简单地转移?像这样
int32_t result = val << shift;
有没有我遗漏的特别的东西?编译器可以通过一些特殊的方式优化前一个操作吗?
编辑:让我感到困惑的是,他们在整个代码中都使用了“简单的转换”。此外,代码应该高度优化。但我想现代编译器会自己弄清楚,移动是要走的路(而不是乘法)?
它总是符号正确并强制使用正确的 FPU 指令并适用于任何类型的数据。
int32_t val, shift;
// code that initializes val and shift
int32_t result = val * (1 << shift);
旨在将 val
乘以某个二值的幂 x
,其中 shift
是指数,即 x=pow(2,shift)
。为什么他们不简单地转移?像这样
int32_t result = val << shift;
有没有我遗漏的特别的东西?编译器可以通过一些特殊的方式优化前一个操作吗?
编辑:让我感到困惑的是,他们在整个代码中都使用了“简单的转换”。此外,代码应该高度优化。但我想现代编译器会自己弄清楚,移动是要走的路(而不是乘法)?
它总是符号正确并强制使用正确的 FPU 指令并适用于任何类型的数据。