2013-10-12 30 views
0

我對這個問題有疑問,任何幫助都會很棒!截斷的二進制對數

編寫一個程序,該程序將一個整數N作爲參數 並打印出其截斷的二進制對數[log2 N]。提示:的log 2 N] = 1的最大整數`這樣 2 ^升< = N.

我得到了這麼多下來:

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

但我無法弄清楚如何截斷L,同時保持2 ^升< = N

感謝


這是我現在有:

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 ^我這將是小於N.我的測試仍然出來假的,我認爲這是因爲這個問題是問打印的我認爲是最大的而不是因此,當我做

Integer.highestOneBit(i)本N.

正確我不打印出來。例如,如果我做的: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 I應該打印出來是1,而是它打印出0.

我已經嘗試了一堆事情的最重要,但不能得到我做錯了什麼。幫助將不勝感激。謝謝

+0

歡迎來到Stack Overflow!堆棧溢出不適合其他人爲你做功課,但我們可以幫助你引導。到目前爲止,你有什麼嘗試? –

+0

嗨,當然!我只是不明白2^l可以如何 user2874403

+0

林也試圖兩種方法的權力,並試圖從它倒退 – user2874403

回答

1

我相信你在這裏尋找的答案是基於數字如何實際存儲在計算機中的基本概念,以及在這樣的問題中如何將用於你的優勢

號碼在計算機被存儲在二進制 - 一系列一和零的其中每列表示2的冪:

enter image description here

(以上從http://www.mathincomputers.com/binary.html圖像 - 參見二進制的詳細信息)

2的第零冪在右邊結束。因此,例如,01001表示十進制值2^0 + 2^3; 9.

有趣的是,這種存儲格式爲我們提供了一些關於數字的附加信息。我們可以看到2^3是由9個組成的2的最高功率。讓我們想象一下只有它包含的功率,由斬斷除了最高的以外的所有其他1。這是一個截斷,並導致了這一點:

現在,您會發現這個值表示8,或2^3。把它歸結爲基礎,現在讓我們看看什麼是日誌基礎2 真的代表。這是你提高2的力量,讓你找到你的日誌。 log2(8)是3.你能看到這裏出現的模式嗎?

  • 位置的最高位的可用作一個近似它的對數底2的值。

2^3是第3位上在我們的例子中,所以截短近似登錄基座2(9)爲3。

所以9的截短的以2爲底的對數是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),highestOneBit(9)返回8(1000),這可能是有用的。

找到數字的最高位的位置的簡單方法涉及執行位移,直到值爲零。有點像這樣:

// 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); 
+0

這幫助了很多謝謝!我現在有這樣的代碼: \t int N = Integer.parseInt(args [0]); \t \t int i = 0; //循環控制計數器 \t \t int v = 1; //目前的兩 \t \t而功率(Math.pow(2,i)的<= N){ \t \t \t 的System.out.println((數學式。pow(2,i))); \t \t \t \t i = i + 1; \t \t v = 2 * v; 這打印出所有的2 ^我少N,所以例如,如果我把N放在22它將打印出1,2,4和16,但我想這樣只有16打印出來,這使得它最大的整數小於22.我只是無法打印循環中的MAX數字。這可能嗎? – user2874403

+0

真棒,沒問題!如果您將代碼編輯爲原始問題(例如,編輯:現在就是我所擁有的......),那麼這會使其對這個問題的任何其他人更具可讀性和有用性:)但是Integer.highestOneBit可以在這裏使用,但是它爲你做了大部分工作,所以這取決於你有多少實施自己。 –

+0

一旦你完成了,你可以把這個標記爲接受的答案來解決這個問題:) –

相關問題