这是一篇简单的记录。
最近在写 YTL 的过程中遇到这样一个子问题:需要定义一个函数 uint32_t func(uint32_t num)
,返回不小于 num
的最小的 2 的幂方。例如
1 | 1 == func(1); |
一开始我想了个用位运算的奇技淫巧,自我感觉还不错:
1 | uint32_t func(uint32_t num) { |
后来一想,「不要在编译器面前装屄」,于是发现老实用 std::log2
来计算的话,效率要高出五倍多:
1 | // #include <cmath> |
再一想,std::ceil
本来就快,std::log2
有快速解法。那么如果把 1 << foo
换成 std::pow(2.0, foo)
会怎样呢?结果发现,大概是由于 std::pow
是为浮点数运算设计的,所以没为 2 的幂方做优化,所以效率还不如位运算:
1 | // #include <cmath> |
以上。