我想知道以下代码的时间复杂度。如果不是恒定时间,那么什么是更好的解决方案?
static bool powerOfTwo(double number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
答案 0 :(得分:1)
这是恒定的时间,但它不是最快的恒定时间解决方案。如果我们对真正小double
s(即次正规)的错误答案感到满意
long bits = BitConverter.DoubleToInt64Bits(number);
return (bits & 0xfffffffffffffL == 0L) && number != 0.0;
我们简单地拉出尾数并检查它是否为零(好吧,实际上是1,因为所有正常双打都有一个隐含的1)。如果这是真的,那么数字必须是2的幂,或0.如果你想让它适用于次正规数,那就更多了。