我尝试使用日志,但它比迭代版本消耗的时间更多,以便找到答案。 数字是整数。
Using log:-
int ans = (log(x)/log(2));
Iterative version:-
int temp;
while(x)
{
temp = temp/2;
count++;
}
count--;
答案 0 :(得分:1)
基本整数数据类型
对于 x86 架构上的整数,只有一条O(1)
指令:
返回MSB设置位的位置。所以你不需要进行迭代O(log(n))
分割,移位或bin搜索。为了确保符号(2' os补码)不会使负数变得混乱,请使用abs
值。
<强> bigints 强>
对于这些,您需要检查MSW非零WORD。并使用#1 。这是O(log(n))
。 n
是您要测试的数字。
浮点
这些通常非常简单O(1)
因为您只是提取指数,它直接告诉您MSB设置位的位置。
对于大多数体系结构中的基本浮点数据类型, FPU HW 直接实现log2
,但它们不会返回整数样式结果...