/*思想:由于三(四)位二进制等于一位八(十六)进制 。找到毗邻数组长度最小的3(4)的倍数,作为新数组长度。多余位数(高位)用0补齐。*/
public class PracticeDemo {
public static void BtoOHex(int n,String s) {
int m = s.length();
int sum0 = 0;
//二进制转为十进制
System.out.print("输出的十进制数为:");
for(int i = 0;i < m;i++)
{
int c = s.charAt(i);
int num = c >= '0'? c-'0' : null;
sum0+= num*Math.pow(2,m-1-i);
}
System.out.println();
System.out.println(sum0+"");
char[] ar = s.toCharArray();//将字符串转换为字符数组
for(int i = 0 ;i < 100;i++)//m为新求数组长度
{
if(m%n == 0) //当n=3时是八进制转换;n=4时是十六进制转换
{
break;
}
else
m++;
}
char[] arr = new char[m];
for( int i = 0;i < m;i++) //添加'0'
{
if(i <= ar.length-1)
{
arr[m-1-i] = ar[s.length()-1-i];
//System.arraycopy(arr,0,ar,m-ar.length,ar.length);
}
else
{
arr[m-1-i] = '0';
}
}
if(n > 3)
{
System.out.println("输出十六制数为:");
}
else
{
System.out.println("输出八制数为:");
}
for(int i = 0;i < arr.length;i=i) //控制新数组位数
{
int num = 0;
int sum = 0;
for(int j = n-1;j > -1;j--,i++)//用于3位求和或者4位求和
{
if(n > 3)
{
num = arr[i] >= 'A'? arr[i]-'A'+10:arr[i] - '0';
}
else
{
num = arr[i] >= '0'? arr[i]-'0':null;
}
sum += num * Math.pow(2,j);
}
if(n > 3)
{
if(sum > 9)
{
switch(sum)
{
case 10 : System.out.print("A");break;
case 11 : System.out.print("B");break;
case 12 : System.out.print("C");break;
case 13 : System.out.print("D");break;
case 14 : System.out.print("E");break;
case 15 : System.out.print("F");break;
}
}
else
{
System.out.print(sum+"");
}
}
else
{
System.out.print(sum+"");
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
System.out.println("输入二进制数:");
String s = in.nextLine();
int a = 3;//当a=3时为八进制转换,当a=4时十六进制转换,
//int a = 4;
BtoOHex(a,s);
}
}