大于lg N的最小整数

时间:2010-10-14 15:58:25

标签: java algorithm math bit-manipulation

我正在读某个地方:

  

大于lg N的最小整数   是需要的位数   以相同的方式表示二进制中的N.   那个大于的最小整数   log10 N是位数   要求以十进制表示N.

     

Java声明

for (lgN = 0; N > 0; lgN++, N /= 2) ; 
     

是一种计算的简单方法   最大整数大于lg N

我可能在这里遗漏了一些东西,但是Java语句如何计算大于lg N的最小整数?

11 个答案:

答案 0 :(得分:8)

如果重写为while循环可能会更清楚:

lgN = 0
while( N > 0 ) {
    lgN++;
    N = N/2;
}

可以将其视为“在我们移开所有1之前我们必须右移多少次”(让我们留下零)

答案 1 :(得分:3)

在纸上写出来。例如,对于N = 1750

   lgN   N      N > 0?
1   0    1750   y
2   1    875    y
3   2    437    y
4   3    218    y
5   4    109    y
6   5    54     y
7   6    27     y
8   7    13     y
9   8    6      y  
10  9    3      y
11  10   1      y
12  11   0      n  stop; lgN = 11

答案 2 :(得分:2)

这是您应该问的问题的答案,即如何最好地计算:

不要用循环执行此操作。直接计算:

int bits = (int) Math.floor(Math.log(n)/Math.log(2)) + 1;

小心不要让n == 0

答案 3 :(得分:1)

在样本输入上跟踪此问题有什么问题吗?

step 1) N = 10, lgN = 0
step 2) N = 5,  lgN = 1
step 3) N = 2,  lgN = 2
step 4) N = 1,  lgN = 3
step 5) N = 0,  lgN = 4

lgN到底是4。这是大于log(2, 10)

的最小整数

答案 4 :(得分:1)

看起来这是计算N的log_2。所以从二进制的角度来看,表示N需要多少位?你找到的方法是计算你可以将N除以2的次数(将N中的位移到右边的1个空格)。在N到达0之前执行此操作的次数是您正在计算的值。

答案 5 :(得分:1)

对于那些正在切断并尝试通过为未提出的问题提供更有效的解决方案来“停止循环疯狂”的人,我建议这同时更有效和可读:

 public int bitsNeeded(int n) {
     return 32 - Integer.numberOfLeadingZeros(n);
 }

正如Javadoc for Integer.numberOfLeadingZeros()所说:

  

请注意,此方法与对数基数2密切相关。对于所有正int值x:

     
      
  • floor(log2(x)) = 31 - numberOfLeadingZeros(x)
  •   
  • ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
  •   

我之前没有发布这个,因为它正如我所说的那样切线。 OP试图了解循环,而不是找到“最好”的做事方式。

答案 6 :(得分:0)

以二进制形式考虑N,左边没有所有零。

例如,对于19,它将是10011。

每个N / = 2正在右移一位:

  • 10011
  • 1001
  • 100
  • 10
  • 1
  • 0

当N等于0时,lgN(这是步数)等于log(N)。

答案 7 :(得分:0)

lg N小于k:

  • 当且仅当N小于2 ^ k
  • 当且仅当N除以2,k次时,结果为0(记住整数除法向下舍入)。

因此,大于lg N的最小整数是得到0所需的除数2,这就是循环的作用。

答案 8 :(得分:0)

假设其他一切都是正确的,代码将使用存在于循环之外的“lgN”变量。当循环结束时,“lgN”就是答案。

答案 9 :(得分:0)

是的,基数为2对数...(ln N)/(ln 2),而不是自然对数

答案 10 :(得分:0)

这是一个for循环。它的初始条件是lgN的值为零。只要N大于零,循环就会继续。在循环的每次迭代中,它将1添加到lgN并将N除以2。

这是循环所做的非常直接的翻译。它是如何工作的?好吧,第一次通过循环,它增加lgN并将N除以2.因此,如果N为1,N现在为零,我们就完成了。如果N大于1,我们必须再次迭代。每次你可以将N除以2而不得到零是二进制表示中的另一个必需位。代码基本上问:“在达到0之前,我可以将N除以2多少次?”这是大于lg N的最小整数。