`
JAVA天地
  • 浏览: 673575 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

三十六進制之間隨便轉換

阅读更多

去年在網上給一家公司投簡歷的時候,對方要求寫一個任意進制轉換的函數,當時沒有回過神來,也不知道JAVA中有這樣的函數,呵呵。于是就自己操刀,寫了這個三十六進制之音隨便轉的函數。不過,權當練習吧,如果你不會,倒真的可以看看,學學二進制到十進制、十進制到二進制之音是如何轉何的。

/*
程序说明:
理论上是一个任意进制的程序,但是由于字母的有限,所有只能转换最多36进制,即0-9,a-z
思路是:
先将任意进制转换为10进制,再将10进制转换到任意进制
1、任意进制转换为10进制的转换
分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合,利用相乘相加的原则
整数部分:(如111的二进制到十进制就是:1*pow(2,2)+1*pow(2,1)+1*pow(2,1))
小数部分:利用相乘相加的原则
2、10进制转换到任意进制的转换
分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合
整数部分:利用相除取余的原则

小数部分:利用相乘取整的原则
如:原数为0.9876,转换为二进制,即每次乘2(当然这个便没有举好,有错误,能理解就行了)
现数余数
0.97521
0.95041
0.90081
0.80161
0.60321
0.20641
0.41280
*/
import java.io.*;

import java.util.*;

public class JZZH
{
//*****************************任意进制到十进制的转换*****************************
//任意进制到十进制的转换

String anySystemToTen(double longNum)
throws Exception
{
String strNum = String.valueOf(longNum);
//将取得的整数部份和小数部份的进制结合在一起,并将其还原为浮点数
//strNum=intToTenSystem(strInt,JZ)+"."+lessToTenSystem(strLess,JZ);
return strNum;
}
//保证输入的数与进制相配

boolean checkInputNumIsOK(int Num, int JZ)
{
if (Num <= JZ - 1)
return true;
else
return false;
}
//由取最得的字符返回相应的数字

String letterToInteger(String tChar)
{
int gotNum = 0;
int kg = 0; //确定前面该字符是不是已经赋值,这就是使用if语句所留下的后症
String S;
if (tChar.equals("A"))
{
gotNum = 10;
kg = 1;
}
else if (tChar.equals("B"))
{
gotNum = 11;
kg = 1;
}
else if (tChar.equals("C"))
{
gotNum = 12;
kg = 1;
}
else if (tChar.equals("D"))
{
gotNum = 13;
kg = 1;
}
else if (tChar.equals("E"))
{
gotNum = 14;
kg = 1;
}
else if (tChar.equals("F"))
{
gotNum = 15;
kg = 1;
}
else if (tChar.equals("G"))
{
gotNum = 16;
kg = 1;
}
else if (tChar.equals("H"))
{
gotNum = 17;
kg = 1;
}
else if (tChar.equals("I"))
{
gotNum = 18;
kg = 1;
}
else if (tChar.equals("J"))
{
gotNum = 19;
kg = 1;
}
else if (tChar.equals("K"))
{
gotNum = 20;
kg = 1;
}
else if (tChar.equals("L"))
{
gotNum = 21;
kg = 1;
}
else if (tChar.equals("M"))
{
gotNum = 22;
kg = 1;
}
else if (tChar.equals("O"))
{
gotNum = 23;
kg = 1;
}
else if (tChar.equals("P"))
{
gotNum = 24;
kg = 1;
}
else if (tChar.equals("Q"))
{
gotNum = 25;
kg = 1;
}
else if (tChar.equals("R"))
{
gotNum = 26;
kg = 1;
}
else if (tChar.equals("S"))
{
gotNum = 27;
kg = 1;
}
else if (tChar.equals("T"))
{
gotNum = 28;
kg = 1;
}
else if (tChar.equals("U"))
{
gotNum = 29;
kg = 1;
}
else if (tChar.equals("V"))
{
gotNum = 30;
kg = 1;
}
else if (tChar.equals("W"))
{
gotNum = 31;
kg = 1;
}
else if (tChar.equals("X"))
{
gotNum = 32;
kg = 1;
}
else if (tChar.equals("Y"))
{
gotNum = 33;
kg = 1;
}
else if (tChar.equals("Z"))
{
gotNum = 34;
kg = 1;
}
else if (kg == 0)
{
gotNum = Integer.parseInt(tChar);
}
S = String.valueOf(gotNum);
return S;
}

//浮点数的整数部份转换为十进制

String intToTenSystem(String strNum, int JZ)
throws Exception
{
strNum = strNum.toUpperCase(); //全部转换为大写,方便字符到数字的转换
double longNum = 0;
int len = strNum.length(); //取得字符串的长度
int tInt = 0; //初使化数组位置为0
int gotNum = 0; //一个一个字符取出所对应的数字
while (len > 0)
{ //如果没有将字符串的字符转换完,就继续
String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
gotNum = Integer.parseInt(letterToInteger(tChar));
if (!checkInputNumIsOK(gotNum, JZ))
{
System.out.println("你的输入与转换的进制不符,请检查!");
System.exit(-1);
}

longNum = longNum + gotNum * (Math.pow(JZ, len - 1));
tInt++;
len--;

}
return String.valueOf(longNum);
}
//浮点数小数部份转换为十进制

String lessToTenSystem(String strNum, int JZ)
throws Exception
{
strNum = strNum.toUpperCase();
double longNum = 0;
int len = strNum.length(); //取得字符的长度
int tInt = 0; //取第tInt个字符
int gotNum = 0; //取出的字符转换为数字
int cfInt = -1; //多少次次方
while (len > 0)
{
String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
gotNum = Integer.parseInt(letterToInteger(tChar));
if (!checkInputNumIsOK(gotNum, JZ))
{
System.out.println("你的输入与转换的进制不符,请检查!");
System.exit(-1);
}
//保存出小数部份从对应的进制到十进制的总值
longNum = longNum + gotNum * (Math.pow(JZ, cfInt)); //关键算法
tInt++; //字符串中位置加一
len--; //字符串总长度减一
cfInt--;
}
return String.valueOf(longNum);
}
//返回一个浮点数的整数或者是小数部份

String returnWantPart(String doubleNum, String whichPart)
throws Exception
{
String strNum = doubleNum;
String leftStr;
String rightStr;
//如果输入的是一个浮点数
if (strNum.indexOf(".") != -1)
{
StringTokenizer fenxi = new StringTokenizer(strNum, ".");
leftStr = fenxi.nextToken();
rightStr = fenxi.nextToken();
}
else
{ //如果输入的是一个整数
leftStr = strNum;
rightStr = "0";
}
String returnStr = "";
if (whichPart.equals("left"))
returnStr = leftStr;
else if (whichPart.equals("right"))
returnStr = rightStr;
return returnStr;
}
//*****************************任意进制到十进制的转换*****************************
//*****************************十进制到任意进制的转换*****************************

String tenToAnySystem_Int(String strInt, int JZ)
{ //因为由任意进制到十进制的转换结果为"整数部分.小数部份"
//也就是分成整数和小数部份分别转换
//此函数完成的功能是十进制的整数部分到任意进制的转换
try
{
//取出整数部份
strInt = returnWantPart(strInt, "left");
}
catch (Exception e)
{
e.printStackTrace();
}
long intStr = Long.parseLong(strInt);
long[] result = new long[50]; //用50个数组来保存相除的余数
long T;
String resultStr = "";
int i = 0; //数组的下标
while (intStr != 0)
{
result[i] = intStr % JZ; //取出余数
intStr = intStr - result[i]; //现数为减去余数的数
intStr = intStr / JZ;
i++; //数组下标增加一
}
//将数组全部反序排列,并返回结果
for (int j1 = 0, j2 = i - 1; j1 < (i / 2); j1++, j2--)
{
T = result[j1];
result[j1] = result[j2];
result[j2] = T;
}
for (int j = 0; j < i; j++)
{
resultStr = resultStr + intToLetter(result[j]);

}
return resultStr;

}
//此函数完成的功能是十进制的小数部分到任意进制的转换

String temToAnySystem_Less(String strLess, int JZ)
{
double T = 0;
T = Double.parseDouble(strLess);
String resultStr = "";
String strInt = "";
//精度取到小数点后面6位为止
int JinDu = 0;
int i = 0; //数组下标
int[] result = new int[50];
for (int j = 0; j < 50; j++) //将数组初使化
result[j] = 0;
try
{
while (JinDu <= 6 && T > 0.000001)
{
double tNum = 0;
tNum = T * JZ;
if (tNum > 1)
{ //取出整数部份
try
{
strInt = returnWantPart(String.valueOf(tNum), "left");
}
catch (Exception e)
{
e.printStackTrace();
}
result[i] = Integer.parseInt(strInt);
T = tNum - result[i]; //将当前数减去取出来的数
}
else
{
//如果整数小于零,那么整数部分就是0
result[i] = 0;
}
JinDu++;
i++;

}
}
catch (Exception e)
{
e.printStackTrace();
}
for (int j = 0; j < i; j++)
resultStr = resultStr + String.valueOf(result[j]);
if (i == 0)
return "0";
else
return resultStr;

}
//将取得的数字转换为相应的字母

String intToLetter(long num)
{
String result = "";
String S = "";
if (0 <= num && num <= 9)
result = String.valueOf(num);
else if (num > 9)
{
S = String.valueOf(num); //将长整型转换为字符串型
switch (Integer.parseInt(S)) //将字符串型转换为整型
{
case 10:
result = "A";
break;
case 11:
result = "B";
break;
case 12:
result = "C";
break;
case 13:
result = "D";
break;
case 14:
result = "E";
break;
case 15:
result = "F";
break;
case 16:
result = "G";
break;
case 17:
result = "H";
break;
case 18:
result = "I";
break;
case 19:
result = "G";
break;
case 20:
result = "K";
break;
case 21:
result = "L";
break;
case 22:
result = "M";
break;
case 23:
result = "N";
break;
case 24:
result = "O";
break;
case 25:
result = "P";
break;
case 26:
result = "Q";
break;
case 27:
result = "R";
break;
case 28:
result = "S";
break;
case 29:
result = "T";
break;
case 30:
result = "U";
break;
case 31:
result = "V";
break;
case 32:
result = "W";
break;
case 33:
result = "X";
break;
case 34:
result = "Y";
break;
case 35:
result = "Z";
break;
}
}
return result;
}
//*****************************十进制到任意进制的转换*****************************

public static void main(String[] arg)
throws Exception
{
try
{
JZZH jzzh = new JZZH();
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String inData = " ";

while (!inData.toUpperCase().equals("QUIT"))
{
System.out.print("请输入一个数(quit退出)(格式:原数,原数进制,要转换到的进制):");
inData = br.readLine();
if (inData.equals("") || inData.equals(" "))
continue;
if (inData.toUpperCase().equals("QUIT"))
break;
StringTokenizer fenxi = new StringTokenizer(inData, ",");
String tData = fenxi.nextToken(); //取出原数
//String whichPart=
//System.out.println("The Result is :"+tData);
int whichSystem = Integer.parseInt(fenxi.nextToken()); //取出原进制
int targetSystem = Integer.parseInt(fenxi.nextToken()); //取出要转换的进制
String returnLeftPart; //输入数的整数部分
String returnRightPart; //输入数的小数部分
//分别取出数的左面和右面
returnLeftPart = jzzh.returnWantPart(tData, "left"); //取出输入数的整数部分
returnRightPart = jzzh.returnWantPart(tData, "right"); //取出输入数的小数部分

String anyChangedToIntSystem; //用于接收输入数的整数部分转换后的结果
String anyChangedToLessSystem; //用于接收输入数的小数部分转换后的结果
anyChangedToIntSystem =
jzzh.intToTenSystem(returnLeftPart, whichSystem);
anyChangedToLessSystem =
jzzh.lessToTenSystem(returnRightPart, whichSystem);

double leftNum = Double.parseDouble(anyChangedToIntSystem);
double rightNum = Double.parseDouble(anyChangedToLessSystem);
double totalNum = leftNum + rightNum; //拼合结果
System.out.println(tData + "由" + whichSystem + "到10进制的结果是:" +
jzzh.anySystemToTen(totalNum));

//十进制到任意进制的转换temToAnySystem_Less
String tenChangedToAnySystemInt = "";
String tenChangedToAnySystemLess = "";
tenChangedToAnySystemInt =
jzzh.tenToAnySystem_Int(anyChangedToIntSystem, targetSystem);
tenChangedToAnySystemLess =
jzzh.temToAnySystem_Less(anyChangedToLessSystem, targetSystem);
System.out.println(tData + "由" + whichSystem + "到" + targetSystem +
"进制的结果是:" + tenChangedToAnySystemInt + "." +
tenChangedToAnySystemLess);

}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

分享到:
评论

相关推荐

    C#学习例子

    小小计算器相对于Windows自带的其优点在于二进制/八进制/十六进制之间可以任意多位数等价转换,而Windows自带的有位数的限制;里面的值得一提的是算法,不足之处是从十进制转换为其它进制时,最大数为10的15次方减1...

    《计算机基础》全套PPT电子课件教案-第一章-计算机基础知识.ppt

    三、各种进制数的转换数制之间的转换是通过特定算法完成的。例如,将二进制转换为十进制,可以采用累加权值的方法;将十进制转换为二进制,通常使用除2取余法;八进制和十六进制转换至二进制或十进制,也可以通过...

    大学计算机考试答案.pdf

    例如,十进制数100转换为二进制是01100100,转换为八进制是144,转换为十六进制是64。 4. **计算机应用领域**:资料检索属于数据处理,这是计算机应用的一种,还包括科学计算、实时控制和人工智能等。 5. **编程...

    学计算机基础期末复习题.doc

    2. 二进制 11101111 转换成十六进制数:77。 3. 十进制数 178.75 对应的二进制数:10110010.11。 4. 一个字节由 8 个二进制位形成。 5. 原码表示中,用 1 位表示正负号,一个字节能表示的最大有标记数:127。 6. ...

    2021-2022计算机二级等级考试试题及答案No.13046.docx

    17. **十进制到二进制的转换**:十进制数58转换成二进制数是(111010),这一转换过程是正确的(正确答案:正确)。 ### 计算机硬件历史 18. **硬件巨头“蓝色巨人”**:“蓝色巨人”通常指的是IBM公司(选项A),它...

    专升本计算机基础复习资料.doc

    - 数制:包括十进制、二进制、十六进制、八进制等,它们之间可以相互转换 - 码制:用于表示字符,如ASCII码、Unicode码等 - 汉字编码:包括字形、字音、音形、数字编码等多种方案 6. **计算机中信息的单位** - ...

    高中信息技术会考试题网络部分含答案.doc

    每个IP地址段由8位二进制组成,转换为十进制后范围是0到255。 17. 错误的IP地址表述:IP地址可以随便指定。IP地址必须唯一且遵守分配规则。 18. 子网掩码255.255.255.0允许的终端数量:254台。除去网络地址和广播...

    职称计算机Windows XP考试试题(三).docx

    2. **硬件配置与性能**:第十七题涉及计算机硬件配置与性能之间的关系。正确选项是**D.在微型计算机性能指标中,CPU的主频越高,其运算速度越快**。主频越高意味着CPU执行指令的速度越快。 ### 六、外存储设备与内...

    06年计算机职称考试模拟题.doc

    - 不同进制之间的数值比较需要转换到同一进制下进行。 - 此题答案为(D),即十进制的1789最大。 #### 8. 启动DOS系统 - 实际上是将DOS系统加载到内存中,并使之处于运行状态。 #### 9. 内部命令 - 内部命令是DOS...

    四年级数学下册教材梳理数与代数4小数的意义和性质新人教版

    - 小数是十进制分数的另一种表达,方便计算和理解。 2. **小数的计数单位**: - 小数的计数单位包括十分之一(0.1)、百分之一(0.01)、千分之一(0.001)等,每个计数单位之间的进率是10。 3. **小数的读法和...

    计算机基础知识参考试题及答案解析(20211011033544).pdf

    2. **ASCII码**: ASCII码是一种字符编码标准,用于将字符转换为数字,便于计算机处理。ASCII码表按照特定顺序排列,包括控制字符、数字符、大写英文字母和小写英文字母。 3. **指令系统**: 指令是计算机执行的基本...

    js压缩图片,js图片base64压缩上传

    在这个函数中,`maxWidth`和`maxHeight`定义了允许的最大尺寸,`quality`参数用于控制JPEG的压缩质量,范围通常在0.1到1之间,值越小质量越低,文件也越小。 在实际应用中,我们可能需要处理多个图片,这时可以使用...

    c语言试题及答案 里面包含了常见的考题和答案

    1. 字节(Byte)是计算机存储的基本单位,通常一个字节包含8个二进制位(bits),即选项C正确。 2. 高级语言编写的源程序需要经过编译才能被计算机执行。编译程序(Compiler)将源代码转换为目标代码,而汇编程序...

    Linux操作系统基础教程

    三.如何得到Linux?.............................................................................................................3 四.如何得到Linux的最新消息?...........................................

    WINCVS和CVSNT安装包

    三部分之间使用冒号“:”来进行分割。 用户名:就是登陆CVS的用户名 密 码:用户的密码,这里是经过加密的,如果为空,那么就是空密码 本地用户:CVS用户这个别名对应的本地用户,(跟本地用户没有任何其 他...

    网管教程 从入门到精通软件篇.txt

    BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 BUN:CakeWalk 声音...

    如何编写批处理文件批处理文件批处理文件

    标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 4.Rem 命令 注释...

Global site tag (gtag.js) - Google Analytics