Algorithm 找到一个数字在达到1之前可以被2除多少次的最有效算法[注:如果可能,在O(1)时间内]

Algorithm 找到一个数字在达到1之前可以被2除多少次的最有效算法[注:如果可能,在O(1)时间内],algorithm,numbers,Algorithm,Numbers,我尝试使用log,但它比迭代版本要花费更多的时间来找到答案。 这个数字是整数 Using log:- int ans = (log(x)/log(2)); Iterative version:- int temp; while(x) { temp = temp/2; count++; } count--; 基本整数数据类型 对于x86体系结构上的整数,有一条O(1)指令: 返回MSB集合位的位置的。因此,您不需要执行迭代的O(log(n))分割、移位或bin搜索。为确保

我尝试使用log,但它比迭代版本要花费更多的时间来找到答案。 这个数字是整数

Using log:-
int ans = (log(x)/log(2));

Iterative version:-
int temp;
while(x)
{
    temp = temp/2;
    count++;
}
count--;
  • 基本整数数据类型

    对于x86体系结构上的整数,有一条
    O(1)
    指令:



    返回MSB集合位的位置的。因此,您不需要执行迭代的
    O(log(n))
    分割、移位或bin搜索。为确保符号(2'os补码)不会对负数造成混乱,请使用
    abs

  • bigints

    对于这些,您需要检查MSW非零字。并在其上使用#1。这是
    O(log(n))
    。其中
    n
    是您正在测试的数字

  • 浮点

    这通常是非常简单的
    O(1)
    ,因为您只需提取指数,它直接告诉您MSB集合位的位置

    另外,对于大多数体系结构上的基本浮点数据类型,
    log2
    FPU HW直接实现,但它们不会返回整数样式的结果


  • 实际有效(见现有答案)或渐近有效(见其他现有答案)?您的数字大小和类型已知(32位/64位整数、32位浮点…)吗?我只能猜测它是一个整数,因为它在连续除以2时“达到1”。@Nelxiost float也达到零eventually@harold不过,他们不一定能达到一个目标。