JAVA十六進位制(包含小數)和二進位制互轉
阿新 • • 發佈:2019-02-04
先說下整體思路:
包含小數的十六進位制,我們可以先把它分為整數和小數兩部分,
然後在進行字串比較,進行相應的替換。
包含二進位制的小數,思路差不多,需要注意的是左邊整數不夠四位的補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小白的心得,有不足的地方,可以指點一二。不要和我說你怎麼不用函式。。非要搞這麼複雜,哈哈。八二和二八轉換也和上面差不多