1. 程式人生 > >JAVA十六進位制(包含小數)和二進位制互轉

JAVA十六進位制(包含小數)和二進位制互轉

先說下整體思路:
包含小數的十六進位制,我們可以先把它分為整數和小數兩部分,
然後在進行字串比較,進行相應的替換。

包含二進位制的小數,思路差不多,需要注意的是左邊整數不夠四位的補0,右邊也如此。


import java.math.BigDecimal;

public class Test13 {

    public static void main(String[] args) {//十六-二
        // TODO 自動生成的方法存根

        String e = "0.77";
        String num1 = "";
        String num2 = ""
; if(e.indexOf(".")==-1)//這裡進行判斷是否是小數 { num1 = e; num2 = "0"; } else { String[] s1 = e.split("\\.");//把小數分成兩部分 num1 = s1[0]; num2 = s1[1]; } System.out.println("整數為:"+num1); System.out
.println("小數為:"+num2); String a1= ""; String a3= ""; String a2 = "";//最後輸出 int i = 0, i1 = 0; int j1 = 0; String[] ej={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; String[] bj={"0","1","2","3","4","5","6","7","8"
,"9","A","B","C","D","E","F"}; //處理整數 if(num1.equals("0")) { a1 = "0"; } else{ j1 = num1.length(); i1 = 0; for(i = 0; i<j1;i++) { for(int j = 0; j<ej.length;j++) { System.out.println("擷取的值:"+num1.substring(i1, i1+1)); if(num1.substring(i1, i1+1).equals(bj[j])) { System.out.println("j的值"+j); a1 =a1+ ej[j]; i1 = i1 +1; break; } } } System.out.println("整數十六進位制轉二進位制為:"+a1); } //小數部分 if(num2.equals("0")) { a2 = a1; } else { j1 = num2.length();//計算迴圈次數 System.out.println(j1); i1 =0; for(i = 0; i<j1;i++) { //ej2[i]=num1.substring(i, i+2); for(int j = 0; j<ej.length;j++) { System.out.println("擷取的值:"+num2.substring(i1, i1+1)); if(num2.substring(i1, i1+1).equals(bj[j])) { System.out.println("j的值"+j); a3 =a3+ ej[j]; i1 = i1 +1; break; } } } System.out.println("小數十六進位制轉二進位制為:"+a3); a2 = a1+"."+a3; } System.out.println("十六進位制轉二進位制為:"+a2); } } //上面就是大部分程式碼了,八進位制轉二進位制也是同樣的道理

接下來我們看看二進位制轉十六進位制:

String s = "100001.01"
double s = Double.valueOf(e);
                        String num1 =String.valueOf((int)s);//整數
                        int zj1 = (int) s;
                        BigDecimal b1 = new BigDecimal(e);
                        BigDecimal b2 = new BigDecimal(zj1);
                        double zj2 = b1.subtract(b2).doubleValue();//小數部分
                        String num0 = String.valueOf(zj2);
                        //如果沒有小數點,直接使用split就會報錯。。
                        String[] s1 = num0.split("\\.");

                        String num2 = s1[1];//直接取小數

                        System.out.println("整數為:"+num1);
                        System.out.println("小數為:"+num2);

                        String a1= "";
                        String a3= "";
                        //String a2 = "";//最後輸出

                        int i = 0, i1 = 0;
                        int j1 = 0;
                        String[] ej={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
                        String[] bj={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};

                        if(num1.equals("0"))
                        {
                            a1 = "0";
                        }

                        else
                        {

                        //處理整數
                        if((num1.length()%4)!=0)
                        {
                             j1 = 4-num1.length()%4;
                            for(i = 0;i<j1;i++)
                            {
                                num1 = "0"+num1;

                            }
                            System.out.println("補零   "+num1);//計算左邊需要補幾個0
                        }

                        j1 = num1.length()/4;
                        System.out.println(j1);
                        for(i = 0; i<j1;i++)
                        {

                            //ej2[i]=num1.substring(i, i+2);
                            for(int j = 0; j<ej.length;j++)
                            {
                                System.out.println("擷取的值:"+num1.substring(i1, i1+4));

                                if(num1.substring(i1, i1+4).equals(ej[j]))
                                {
                                    System.out.println("j的值"+j);
                                    a1 =a1+ bj[j];
                                    i1 = i1 +4;
                                    break;

                                }
                            }


                        }
                        System.out.println("整數二進位制轉十六進位制為:"+a1);
                        }

                        if(num2.equals("0"))
                        {
                            a2 = a1;
                        }
                        else
                        {
                        //小數部分
                        if((num2.length()%4)!=0)
                        {
                             j1 = 4-num2.length()%4;//需要新增幾個0
                            for(i = 0;i<j1;i++)
                            {
                                num2 = num2+"0";//這裡和整數的不同

                            }
                            System.out.println("補零   "+num2);
                        }

                        j1 = num2.length()/4;//計算迴圈次數
                        System.out.println(j1);
                        i1 =0;
                        for(i = 0; i<j1;i++)
                        {

                            //ej2[i]=num1.substring(i, i+2);
                            for(int j = 0; j<ej.length;j++)
                            {
                                System.out.println("擷取的值:"+num2.substring(i1, i1+4));

                                //System.out.println(num1.substring(i, i+3));
                                //System.out.println("ej[j]的值:"+ej[j]);
                                //System.out.println(num1.substring(i, i+3).equals(ej[j]));


                                if(num2.substring(i1, i1+4).equals(ej[j]))
                                {
                                    System.out.println("j的值"+j);
                                    a3 =a3+ bj[j];
                                    i1 = i1 +4;

                                    break;

                                }
                            }


                        }

                        System.out.println("小數二進位制轉十六進位制為:"+a3);
                        a2 = a1+"."+a3;
                        }
                        System.out.println("二進位制轉十六進位制為:"+a2);

                    }

haha,上面比較亂,我好久之前寫的了,沒時間整理,處理整數和小數哪裡有優化的地方,或許是當時想複雜了,將就著看吧。新手java小白的心得,有不足的地方,可以指點一二。不要和我說你怎麼不用函式。。非要搞這麼複雜,哈哈。八二和二八轉換也和上面差不多