以下是引用wmf2014在2020-4-13 21:27:00的发言:
当然也可以右移到负数,循环5次,结果是32-5即可。
for(i=88484300;i>0;j++,i*=2);
printf("%d\n",32-j);
还有一个快速去2位底的对数函数,这是网上^v的
int FastLog2(int x)
{
float fx;
unsigned long ix, exp;
fx = (float)x;
ix = *(unsigned long*)&fx;
exp = (ix >> 23) & 0xFF;
return exp - 127;
}
for(i=88484300;i>0;j++,i*=2);
printf("%d\n",32-j);
这个做法是目前所有实现中最优秀的做法了
但是有一个小小的瑕疵 这个做法利用了有符号数溢出 这是一个不可靠的特性
改为无符号类型 循环退出条件改为检查最高位是不是1 会更合适一些
对数函数的是目前所有做法里面最快的
但ix = *(unsigned long*)&fx;这一句其实不能保证正确
float* 转换到 unsigned long* 再做一元*是做法我个人不提倡
备注 我知道这个做法十分著名 但我就是不提倡