算法---進制轉換,八進制,十六進制,二進制


一、 十六進制轉換為八進制

主要思想為:

  1. 十六進制轉化為二進制
  2. 二進制轉化為八進制

(1)十六進制轉化為二進制

  1. 從字符串數組中使用charat(i)函數逐個讀取字符,並使用switch將其逐步轉化為二進制形式
  2. 轉化后的結果保存在stringBuffer對象中,使用append方法;
  3. 結果轉化為字符串並傳回main函數中,字符串進行判斷,根據位數書,判斷是否是4的倍數,若不是,則前頭補0;

(2)二進制轉化為八進制

  1. 首先判斷二進制數的前三位,若全為0,則跳過從第四位開始讀,此舉是為了防止轉化為八進制后首位為0的情況。
  2. 使用substring方法每3位都一次,轉化后放進stringbuffer對象中。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
              //讀取輸入的十六進制數字個數
                Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String[] hexa = new String[n];
        String string;
        scanner.nextLine();
        for(int i=0;i<n;i++)
        {
                       //讀取十六進制數存入字符串數組中
            hexa[i] = scanner.next();
        }
        for(int i=0;i<n;i++)
        {
                       //調用函數,將十六進制數轉化為二進制數,返回字符串
            string = tobinary(hexa[i]);
            int length_bin = string.length();
                        //對不滿足4倍個數的字符串前頭補0
            if(length_bin%3==1) string = "000"+string;
            if(length_bin%3==2) string = "00"+string;
                        //調用函數,將二進制數轉化為八進制數
            String stroct = toOct(string);
                       //輸出結果
            System.out.println(stroct);
        }
        
    }
    //將十六進制轉化為二進制
    private static String tobinary(String hexa)
    {
        int length = hexa.length();
        StringBuffer aBuffer = new StringBuffer();    
        for(int i=0;i<length;i++)
        {
            //在字符串中逐步讀取字符並替換為相應的二進制數,注意!!charat函數是從頭開始讀
            switch (hexa.charAt(i)) {
            case '0':
                aBuffer.append("0000");
                break;
            case '1':
                aBuffer.append("0001");
                break;
            case '2':
                aBuffer.append("0010");
                break;
            case '3':
                aBuffer.append("0011");
                break;
            case '4':
                aBuffer.append("0100");
                break;
            case '5':
                aBuffer.append("0101");
                break;
            case '6':
                aBuffer.append("0110");
                break;
            case '7':
                aBuffer.append("0111");
                break;
            case '8':
                aBuffer.append("1000");
                break;
            case '9':
                aBuffer.append("1001");
                break;
            case 'A':
                aBuffer.append("1010");
                break;
            case 'B':
                aBuffer.append("1011");
                break;
            case 'C':
                aBuffer.append("1100");
                break;
            case 'D':
                aBuffer.append("1101");
                break;
            case 'E':
                aBuffer.append("1110");
                break;
            case 'F':
                aBuffer.append("1111");
                break;
            default:
                break;
            }
        }
        return aBuffer.toString();
        
    }
    //將二進制轉化為八進制
    private static String toOct(String binary)
    {
        int len = binary.length();
        int k;
        StringBuffer stringBuffer = new StringBuffer();
                //判斷開始位置,去除轉化為八進制數后首位為0的情況
        if(binary.substring(0, 4).equals("000"))
            k=3;
        else
            k=0;
        for(int i=k;i<len-2;i++)
        {
            switch (binary.substring(i,i+3)) {
            case "000":
                stringBuffer.append("0");
                break;
            case "001":
                stringBuffer.append("1");
                break;
            case "010":
                stringBuffer.append("2");
                break;
            case "011":
                stringBuffer.append("3");
                break;
            case "100":
                stringBuffer.append("4");
                break;
            case "101":
                stringBuffer.append("5");
                break;
            case "110":
                stringBuffer.append("6");
                break;
            case "111":
                stringBuffer.append("7");
                break;
            default:
                break;
            }
        }
        return stringBuffer.toString();
}
}  

  

二、十六進制轉化為十進制(方法一)

主要思想為:

  1. 十六進制轉化為二進制
  2. 二進制轉化為十進制

其中步驟一與之前的類似,重點說一下步驟二

  1. 設置標志符號位flag,用於確定字符讀到哪一位;
  2. 從首尾開始讀,按照2的階乘的方法計算后各位相加,得到最終的10進制數(常規算法)
/*方法一*/
import
java.util.Scanner; public class Main { public static void main(String[] args) { Scanner aScanner =new Scanner(System.in); String aString; long result; aString = aScanner.nextLine(); aString = tobinary(aString); result = todec(aString); System.out.println(result); } private static String tobinary(String ahex) { StringBuffer aBuffer = new StringBuffer(); int len = ahex.length(); for(int i =0;i<len;i++) { switch(ahex.charAt(i)) { case '0': aBuffer.append("0000"); break; case '1': aBuffer.append("0001"); break; case '2': aBuffer.append("0010"); break; case '3': aBuffer.append("0011"); break; case '4': aBuffer.append("0100"); break; case '5': aBuffer.append("0101"); break; case '6': aBuffer.append("0110"); break; case '7': aBuffer.append("0111"); break; case '8': aBuffer.append("1000"); break; case '9': aBuffer.append("1001"); break; case 'A': aBuffer.append("1010"); break; case 'B': aBuffer.append("1011"); break; case 'C': aBuffer.append("1100"); break; case 'D': aBuffer.append("1101"); break; case 'E': aBuffer.append("1110"); break; case 'F': aBuffer.append("1111"); break; default: break; } } return aBuffer.toString(); } private static long todec(String abin) { long length = abin.length();
//標志符號位
long sign = length-1; long a = 0; for(int i=0;i<length;i++) { switch(abin.charAt(i)) { case '0': sign--; break; case '1': a = (int) (a + Math.pow(2, sign)); sign--; break; default: break; } } return a; } }

 

三、十六進制轉化為十進制(方法二,原創)

此類方法使我在考慮到十六進制轉化為十進制時對二進制的轉化過於繁瑣而思索出來的,直接將十六機制轉化為十進制的方法

比較上述而言代碼長度更短,所用時間也較短。

思想:

  • 從首位開始讀取十六進制數AB2,將其轉化為對應的10進制數:10 11 2
  • 核心算法:sum = sum + (long) (num*Math.pow(2, (position-1)*4));每位相加,但在相加之前乘以2的(n-1)*4次方,此處的n為位數
  • 即 10*(3-1)*4+11*(2-1)*4+2*(1-1)*4 = result;
  /*方法二*/ 
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
     Scanner aScanner =new Scanner(System.in);
        String aString;
        aString = aScanner.nextLine();
        char[] abin = new char[8];
        abin = aString.toCharArray();
        int len = abin.length;
        long num = 0 , sum = 0,position = len;
        for(int i=0;i<len;i++)
        {
            if(abin[i]>='A' && abin[i]<='F')
                num = abin[i] - 'A' +10; 
            else
                num = abin[i] - '0';
            sum = sum + (long) (num*Math.pow(2, (position-1)*4));
            position--;
        }
        
        System.out.println(sum);        
}
}

 

四、十進制轉化為十六進制

思想

  1. 十進制轉化為二進制
  2. 二進制轉化為十六進制

(1)十進制轉化為二進制

  • 首先使用除2法,得到字符串,而后將字符串反轉,得到正確的與十進制數對應的二進制數(見代碼,不詳解)
  • 補位,驗證是否是4的倍數的位數,不足的前面補0

(2)二進制轉化為十六進制

  • 此處與二進制轉化為八進制思想相同,見前面,較為簡單
  • 需要主要持續使用stringbuffer的對象時要注意清零,便於后續使用,可直接使用setlength(0)方法
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
Scanner  aScanner = new Scanner(System.in);
        long ten = aScanner.nextLong();
        String aString;
        StringBuffer aBuffer = new StringBuffer();
        long m=1,n=0;
        do
        {
            n = ten%2;
            ten = ten/2;
            aBuffer.append(n);
        }while(ten!=0);
        aString = aBuffer.toString();
        //反轉字符串
        char[] achar = new char[100000];
        achar = aString.toCharArray();
        int start = 0;
        int end = achar.length-1;
        while(start<end)
        {
            char temp = achar[start];
            achar[start++] = achar[end];
            achar[end--] = temp;
        }
        aBuffer.setLength(0); //清空內容
        for(int i=0;i<achar.length;i++)
        {
            aBuffer.append(achar[i]);
        }
        aString = aBuffer.toString();
        char[] ahex = new char[10000];
        //補位
        if(achar.length%4==1) 
            aString= "000"+aString;
        else if(achar.length%4==2)
            aString= "00"+aString;
        else if(achar.length%4==3)
            aString= "0"+aString;
        aBuffer.setLength(0); //清空內容
        for(int i=0;i<aString.length()-3;i=i+4)
        {
            switch (aString.substring(i,i+4)) {
            case "0000":
                aBuffer.append("0");
                break;
            case "0001":
                aBuffer.append("1");
                break;
            case "0010":
                aBuffer.append("2");
                break;
            case "0011":
                aBuffer.append("3");
                break;
            case "0100":
                aBuffer.append("4");
                break;
            case "0101":
                aBuffer.append("5");
                break;
            case "0110":
                aBuffer.append("6");
                break;
            case "0111":
                aBuffer.append("7");
                break;
            case "1000":
                aBuffer.append("8");
                break;
            case "1001":
                aBuffer.append("9");
                break;
            case "1010":
                aBuffer.append("A");
                break;
            case "1011":
                aBuffer.append("B");
                break;
            case "1100":
                aBuffer.append("C");
                break;
            case "1101":
                aBuffer.append("D");
                break;
            case "1110":
                aBuffer.append("E");
                break;
            case "1111":
                aBuffer.append("F");
                break;
            default:
                break;
            }
        }
        System.out.println(aBuffer.toString());
        
        aString = aBuffer.toString();
        
        System.out.println();
        
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM