2010-11-11 234 views
4

我想將十進制數轉換爲二進制數。我想將它們存儲在一個數組中。 首先,我需要創建一個具有一定長度的數組,以便我可以存儲二進制數。之後,我執行轉換,這裏是我怎麼做:十進制到二進制轉換

public class Aufg3 { 
    public static void main(String[] args) { 
     int[] test = decToBin(12, getBinArray(12)); 
     for(int i = 0; i < test.length; i++){ 
      System.out.println(test[i]); 
     } 
    } 

    public static int[] getBinArray(int number){ 
     int res = number, length = 0; 
     while(res != 0){   
      res /= 2; 
        length++; 
     } 
     return new int[length]; 
    } 

    public static int[] decToBin(int number, int[] array){ 
     int res = number, k = array.length-1; 
     while(res != 0){ 
      if(res%2 == 0){ 
       array[k] = 0; 
      }else{ 
       array[k] = 1; 
      } 
      k--; 
      res /= 2; 
     } 
     return array; 
    } 
} 

有什麼需要改進的?它應該打印1100的12

+1

這功課嗎?如果是這樣,你應該這樣標記它。 – 2010-11-11 19:27:29

+0

@Jim:[「家庭作業標記...現在不鼓勵,」](http://meta.stackoverflow.com/q/10812),但@ArtWorkAD請(一如既往)遵循[一般準則](http ://tinyurl.com/so-hints):陳述任何特殊的限制,展示你到目前爲止所嘗試的內容,並詢問具體是什麼讓你感到困惑。 – 2010-11-12 14:09:48

回答

3

我假設你想寫你自己的代碼 - 否則這很容易做到使用標準Java庫中的方法。

一些快速評論:

  • 可以擺脫res臨時瓦爾的。直接在number上工作(請記住,Java按值傳遞參數)。
  • 移位比除法更有效(number >>>= 1而不是number /= 2),但是編譯器應該能夠優化這個反正
  • 可以避開模量decToBin如果你只是做array[k] = number & 1;
  • 當你在它,爲什麼不直接從decToBin直接撥打getBinArray?然後你可以撥打decToBin只有一個參數 - 要轉換的值。

這裏是你的代碼稍微優化版本:

public static int[] getBinArray(int number) { 
    int length = 0; 
    while (number != 0) { 
     number >>>= 1; 
     length++; 
    } 
    return new int[length]; 
} 

public static int[] decToBin(int number) { 
    int[] array = getBinArray(number); 
    int k = array.length-1; 
    while (number != 0) 
    { 
     array[k--] = number & 1; 
     number >>>= 1; 
    } 
    return array; 
} 
+0

你能描述一下移位操作嗎? – 2010-11-12 09:04:33

+2

@ArtWorkAD:邏輯移位操作符>>>將操作數中的所有位向右移動指定的位置數,根據需要插入儘可能多的零位以填充空位左邊。因此'number >>> = 1'將所有位向右移一位,插入一個零位作爲MSB。請參閱:http://en.wikipedia.org/wiki/Logical_shift – Grodriguez 2010-11-12 09:47:44

+0

謝謝,你是什麼意思與數組[k--] =數字&1?什麼是「?」 ? – 2010-11-12 09:52:28

6

投入爲什麼不使用Integer類的toBinaryString方法:

System.out.println(Integer.toBinaryString(12)) 
+2

我不知道那種方法。這比我的建議更好。 – nojo 2010-11-11 19:38:17

2

如果這不是功課,沒必要自己做。下面的代碼應該工作:

BigInteger bigInt = new BigInteger(number); 
String asString = bigInt.toString(2); 

可能有更有效的方法,但這肯定是非常可讀和可維護的。

1

還有一些小東西,你可以改善:

  • 您應該定義一個「高層次」的方法將int轉換爲int[]。在當前的代碼中,你必須提到兩次12,這很糟糕。
  • 您應該使用do { ... } while (number != 0)循環。否則,數字0將由空數組表示。
  • 您應該使用x >>> 1而不是x/2,因爲它可以正確處理負數。
  • 如果您想檢查您的代碼是否正確,請編寫另一種方法,將其從二進制轉換回int。那麼你可以檢查binToDec(decToBin(12, ...)) == 12
  • 方法getBinArray不應該是public,因爲它只是一個輔助方法。您可以用private替換public,或者只刪除public