截断的二进制对数

时间:2013-10-12 21:52:43

标签: java eclipse logging binary logarithm

我对这个问题有疑问,任何帮助都会很棒!

编写一个以整数N为单位的程序 参数并打印出截断的二进制对数[log2 N]。提示:[log2 N] = l是这样的最大整数 2 ^ l< = N。

我得到了这么多:

int N = Integer.parseInt(args[0]);  
    double l = Math.log(N) / Math.log(2);
    double a = Math.pow(2, l);

但我无法弄清楚如何在保持2 ^ l< = N

的同时截断l

谢谢


这就是我现在所拥有的:

int N = Integer.parseInt(args [0]);

    int i = 0; // loop control counter
    int v = 1; // current power of two
    while (Math.pow(2 , i) <= N) {


    i = i + 1;
    v = 2 * v; 
    }

    System.out.println(Integer.highestOneBit(N)); 

这打印出等于2 ^ i的整数,该整数小于N.我的测试仍然是假的,我认为这是因为问题是要求打印最大而不是N的i所以当我做的时候

Integer.highestOneBit(I)

正确的我不会打印出来。例如,如果我这样做:N = 38,那么最高的i应该是5,而是打印出来4.

然后我试了一下:

            int N = Integer.parseInt(args[0]);

    int i; // loop control counter
    for (i= 0; Math.pow(2 , i) == N; i++) {

    }
            System.out.println(Integer.highestOneBit(i)); 

如果我使N = 2,我应该打印为1,而是打印出0。

我已经尝试了很多东西,但是无法得到我做错了什么。非常感谢帮助。感谢

1 个答案:

答案 0 :(得分:1)

我相信你在这里寻找的答案是基于一个数字实际存储在计算机中的基本概念,以及如何在一个问题中将用于你的优势就这样。

计算机中的数字以二进制形式存储 - 一系列1和0,每列代表2的幂:

enter image description here

(来自http://www.mathincomputers.com/binary.html的图片上方 - 有关二元的更多信息,请参阅

2的第二个力量在右边结束。因此,01001例如表示十进制值2 ^ 0 + 2 ^ 3; 9。

有趣的是,这种存储格式为我们提供了有关该号码的一些其他信息。我们可以看到2 ^ 3是 2的最高幂 9由9组成。让我们想象一下,除了最高的之外,切断所有其他1的它包含的两个的力量。这是截断,结果如下:

01000

您现在会注意到此值代表8或2 ^ 3。将其归结为基础知识,现在让我们看一下2 真正所代表的日志库。这是你提高2的能力,以获得你找到日志的东西。 log2(8)是3.你能看到这里出现的模式吗?

  • 最高位的位置可用作其对数基数2的近似值。

2 ^ 3是我们示例中的第3位,因此截断近似于log base 2(9)为3。

因此,9的截断二进制对数为3. 2 ^ 3小于9;这是少于来自的地方,找到它的价值的算法只需要找到构成数字的最高位的位置。

更多例子:

12 = 1100.最高位的位置= 3(从右边的零开始)。因此,截断的二进制对数12 = 3.2 ^ 3是<= 12。

38 = 100110.最高位的位置= 5.因此,截断的二进制对数38 = 5.2 ^ 5是<= 38。

这种推送位的级别称为Java中的按位操作。

Integer.highestOneBit(n)基本上返回截断的值。因此,如果n为9(1001),则highOneBit(9)返回8(1000),这可能是有用的。

找到数字中最高位的位置的简单方法是执行 bitshift 直到该值为零。有点像这样:

// Input number - 1001:
int n=9;
int position=0;
// Cache the input number - the loop destroys it.
int originalN=n;

while( n!=0 ){
    position++; // Also position = position + 1;
    n = n>>1; // Shift the bits over one spot (Overwriting n).
    // 1001 becomes 0100, then 0010, then 0001, then 0000 on each iteration. 
    // Hopefully you can then see that n is zero when we've 
    // pushed all the bits off.
}

// Position is now the point at which n became zero.
// In your case, this is also the value of your truncated binary log.
System.out.println("Binary log of "+originalN+" is "+position);