NoS*_*tAl 5 c++ optimization unsigned bit-manipulation fmt
我对C++ fmtlib的这个简短函数如何工作有点困惑.
inline std::uint32_t digits10_clz(std::uint32_t n) {
std::uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12;
return t - (n < powers_of_10_u32[t]) + 1;
}
Run Code Online (Sandbox Code Playgroud)
我理解你可以使用log2(log10)来估计log10的逻辑,并且你需要调整精确值,但乘法对我来说是一个谜.
das*_*ght 10
回想一下公式用于改变对数的底数从b到d是
log d x = log b x/log b d
在我们的例子中,b是2(二进制),并且d是10(十进制).因此,您需要除以log 2 10,这与乘以1/log 2 10相同,即乘以0.30102999566.
现在回想一下,换算12与除以2 12相同,即4096.将1233除以4096得到0.30102539062,这是基本变化公式中分母的一个非常好的近似值.