我已经写了这段代码,但也许有一个更有效的方法。 我假设问题是“这段代码可以改进吗”? 是的,它可以。 你的代码做的是 1.隐式地将整数A转换为double,因为log2(double)接受double参数。 1.使用log2(double)函数对该(double)A取以2为底的对数。 1.将double向下舍入到最接近int,然后加1 1.再次将结果转换为double,然后使用pow(double, double)函数近似2.0**。 1.向下转换结果,希望(遗憾的是,错误地)结果是正确的。 因此,首先,显而易见的是,pow在您的情况下毫无用处。1 << k将1左移k个位位置;结果是2**k。 那么,检测整数中的最高设置位是一个已解决的问题:What is the fastest/most efficient way to find the highest set bit (msb) in an integer in C?
5条答案
按热度按时间yvgpqqbh1#
首先,使用How to do an integer log2() in C++?实现log2,然后移位到比最高位多一位的位置,再减一位以设置所有位。
注意:这将工作到大约
UINT_MAX >> 1
,因为1u <<
将溢出。omvjsjqw2#
这听起来像是一个小问题,它基于https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2,只是没有最后的增量。
不过,这只适用于32位数字,而且未经测试。
kgsdhlau3#
将2自乘到A的位数的幂再减1的通常方法写和读要简单得多。
ldfqzlk84#
在没有任何函数调用的情况下,我建议使用以下算法:
也许有一种更好的方法来做这件事,但这一个只使用位移位。
lawou6xi5#
我已经写了这段代码,但也许有一个更有效的方法。
我假设问题是“这段代码可以改进吗”?
是的,它可以。
你的代码做的是
1.隐式地将整数
A
转换为double
,因为log2(double)
接受double
参数。1.使用
log2(double)
函数对该(double)A
取以2为底的对数。1.将
double
向下舍入到最接近int
,然后加11.再次将结果转换为
double
,然后使用pow(double, double)
函数近似2.0**。1.向下转换结果,希望(遗憾的是,错误地)结果是正确的。
因此,首先,显而易见的是,
pow
在您的情况下毫无用处。1 << k
将1左移k
个位位置;结果是2**k。那么,检测整数中的最高设置位是一个已解决的问题:What is the fastest/most efficient way to find the highest set bit (msb) in an integer in C?