我在ARM CMSIS-NN库中遇到了类似的代码:
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;
我错过了什么特别的东西吗?编译器能以某种特殊的方式优化前一个操作吗?
编辑:让我困惑的是,他们正在使用"简单的shift"。贯穿整个代码。此外,代码应该高度优化。但我猜现代编译器会自己弄清楚,这是转移的方式(而不是乘法)?
它总是符号正确,强制使用正确的FPU指令,并且可以处理任何类型的数据。