移位 1 和乘法 vs 直接移位

Shift 1 and multiply vs direct shift

我在 ARM CMSIS-NN library:

中遇到了类似的代码
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 指令并适用于任何类型的数据。