2014-09-24 26 views
1

說明我仍然在Java 我有代碼的新手,但我仍然感到困惑,它是如何工作的簡介我的二進制轉換器

所以任何人都可以向我解釋我的代碼是如何工作的二進制轉換爲十六進制? 我對嵌套的for循環的一部分 的有點混淆,請幫助我理解這裏的邏輯

繼承人我的代碼:

import java.io.*; 

public class arrays { 
    public static void main(String[] args) throws IOException { 
     BufferedReader input = new BufferedReader(new InputStreamReader(
       System.in)); 
     // Binary Storage 
     String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", 
       "B", "C", "D", "E", "F" }; 
     String[] binary = { "0000", "0001", "0010", "0011", "0100", "0101", 
       "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", 
       "1110", "1111" }; 
     // For User!, input a value: 
     System.out.print("Input your Hex Number here : "); 
     String userInput = input.readLine(); 
     String result = ""; 

     for (int i = 0; i < userInput.length(); i++) { 
      /* used for separating the value */ 
      char temp = userInput.charAt(i); 
      String temp2 = "" + temp + ""; 
      for (int j = 0; j < hex.length; j++) { 
       if (temp2.equalsIgnoreCase(hex[j])) { 
        result = result + "\n" + temp + "- " + binary[j]; 
       } 
      } 
     } 

     //Main output 
     System.out.println("THE BINARY OF " + userInput + ":" + result); 


    } 
} 
+0

此代碼是否工作? – 2014-09-24 21:04:22

+0

@nikpon是的,但它是糟糕的設計。將數據保存在多個數組中並依靠索引來進行相互轉換是一個糟糕的想法。 – azurefrog 2014-09-24 21:06:21

+0

如果評論'用於分隔值'說'檢查每個字符',會幫助你嗎? – 2014-09-24 21:08:15

回答

0

您的代碼的工作,但它是低效的。還有一些簡化的空間。

首先,你可以做什麼,以使你的程序更有效,是建立的十六進制字符的HashMap<Character, String>二進制字符串:

HashMap<Character, String> map = new HashMap<Character, String>(); 
map.put("0", "0000"); 
map.put("1", "0001"); 
// ... 
map.put("F", "1111"); 

現在你不需要內for循環和比較值將會快得多,因爲按鍵查找地圖在技術上是恆定的。

更進一步,而是採用了+符號用於連接字符串,使用StringBuilder建立你的結果和速度了一點東西(read why here)。

也出於可讀性目的,您應該使用更重要的變量名稱而不是temptemp2

這裏你的代碼怎麼看(full running sample link):

// ... 
    StringBuilder result = new StringBuilder(); 

    for (int i = 0; i < userInput.length(); i++) { 
      /* used for separating the value */ 
      char hexVal = userInput.charAt(i); 
      String binary = map.get(hexVal); 
      result.append(binary); 
    } 

    //Main output 
    System.out.println("THE BINARY OF " + userInput + ":" + result.toString()); 

一般來說,這些類型的轉換通過轉換爲十進制值,然後再改正值工作,所以:

binary -> decimal -> hex 
hex -> decimal -> binary 

Java已經有方法可以幫助你做到這一點。

這是如何從一個String包含一個十六進制數的String包含數的二進制值轉換:

String hex = "f";        // 15 in hex 
int decimal = Integer.parseInt(hex, 16);   // this gives 15 in decimal (converts from base 16 to base 10) 
String binary = Integer.toBinaryString(decimal); // this gives "1111" 
System.out.println(binary);      // this prints "1111" 

這是如何從一個String包含二進制數轉換成String包含數的十六進制值:現在

String binary = "1111";     // 15 in decimal 
int decimal = Integer.parseInt(binary, 2); // this gives 15 in decimal (converts from base 2 to base 10) 
String hex = Integer.toHexString(decimal); // this gives "f" 
System.out.println(hex);     // this prints "f" 

,爲你的程序,你可以使用這些方法,你不需要String[] hexString[] binary個陣列或for循環:現在

public static void main(String[] args) throws IOException { 
    BufferedReader input = new BufferedReader(new InputStreamReader(
      System.in)); 

    // For User!, input a value: 
    System.out.print("Input your Hex Number here : "); 
    String userInput = input.readLine(); 

    // conversion from hex to binary in one line, ain't that awesome :) 
    String result = Integer.toBinaryString(Integer.parseInt(userInput, 16)); 

    //Main output 
    System.out.println("THE BINARY OF " + userInput + ":" + result); 

} 

,當然,你必須照顧無效的輸入與任何醒目的Integer.parseIntInteger.toBinaryString拋出異常,使你自己的功能,將檢查是否輸入是有效的十六進制數。