2016-04-23 37 views
0

下面的代碼工作時,我只是想打印出的數字,而不是它們保存在一個字符串變量:嘗試在Java中以字符串格式遞歸地將整數轉換爲二進制文件?

public static void toBinary(int num) { 
    if (num>0) { 
     toBinary(num/2); 
     System.out.print(num%2 + " "); 
    } 
} 

然而,我想要做的就是給每個二進制數字追加到年底一個字符串。我必須做到這一點的方法是:

public static String toBinary(int num){ 
    String binary = ""; 

    if(num > 0){ 
     toBinary(num/2); 
     binary += (num%2); 
    } 
    return binary; 
    } 

無論此方法傳入的數,該字符串最終被一個單一的1或0。我認爲邏輯將是相同的,這顯然是錯誤。任何幫助?的toBinary()方法binary可變

+0

爲什麼不給用戶'Integer.toBinaryString(INT)'? –

+0

請注意,兩個版本的「0」值和任何負數都會失敗。 – Andreas

回答

1

分配返回值:

if(num > 0){ 
    binary = toBinary(num/2); 
    binary += (num%2); 
} 

注:生成二進制字符串是很容易的在Java中 例如

System.out.println(Integer.toBinaryString(23)); 

輸出:

10111 
+0

你有我的+1,但你想教課堂如何使它爲'0'值和負數工作?提示:它需要一個驅動程序方法,並使用位移而不是除法。 – Andreas

+1

@Andreas感謝您的+1。我不會實現我自己的''toBinaryString()''方法,而是使用buitin java方法。如果我們看到''Integer.toBinaryString()''的實現:用於除以2的無符號右移運算符「>>>」(''i >>> = shift;''),使用32位緩衝區來保存結果和「數字」數組獲得「0」或「1」(決定ODD或偶數「[i&mask]」)。到目前爲止,要明確這個方法,我們需要很好地瞭解按位操作符。 –

+0

請注意提問者的姓名:困惑**學生**。這是關於學習編碼的。調用一個庫方法來爲你做並不是練習的要點。但你是對的,學生可能還沒學過位操作。 – Andreas

0

您嘗試在遞歸的問題是,你在每個級別的初始化變量binary,所以你沒有得到遞歸的完整的結果。你只會得到最後一位數字。它將在最後通過備份鏈。

你原來的方法的遞歸相當於將類似以下內容:

public static String toBinary(int num) { 
    if (num>0) 
    return toBinary(num/2) + (num % 2); 
    else 
    return ""; 
} 

注意,無論這和原來的不太好二進制轉換器,因爲他們不處理正確0。他們也不處理負數。

我們可以修正爲0,並妥善處理負數像這樣:

public static String toBinary(int num) { 
    if (num < 0) 
    throw new IllegalArgumentException("Negative numbers not supported"); 
    else if (num == 0) 
    return "0"; 
    else return toBinaryInternal(num); 
} 

private static String toBinaryInternal(int num) { 
    if (num>0) 
    return toBinaryInternal(num/2) + (num % 2); 
    else 
    return ""; 
} 
+0

這樣做的方式稍有不同,並沒有解釋原始代碼有什麼問題。寫一兩句話。 ---如果你想改變(修正)代碼,你也應該使它在'0'值和負數的情況下工作。 – Andreas

+0

'numm'是什麼?如果你的意思是'num',那麼爲什麼要寫它,因爲在那個點上唯一可能的值是'0',所以一個普通的'else'就足夠了。問題在於代碼現在每個數字都以0爲前綴,例如輸入'42'會出現爲'「0101010」'。此外,負數錯誤應該是例外,爲什麼不支持負數呢,例如'-42'是'「11111111111111111111111111010110」'? – Andreas

+0

我試圖保持簡單,堅持接近OP的原始代碼。如果他們想要一種生產代碼的方法,他們不會採用這種方法。我已經更新了這個例子,以解決例外問題並解決了領先的0問題。 –

相關問題