1. 把10进制转成N进制:除N取余,逆序排列
这里逆序排列使用StringBuilder类的reverse()函数来实现。
/**
* 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
* @param tenRadix
* 十进制整数
* @param radix
* 要转换的进制数,例如,要转成2进制数,radix就传入2
* @return radix进制的字符串
*/
public static String string10ToN(int tenRadix, int radix)
{
// 进制编码支持9+26=35进制
String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder buf = new StringBuilder();
int remainder = 0;
while (tenRadix != 0)
{
remainder = tenRadix % radix;// 求余数
tenRadix = tenRadix / radix;// 除以基数
buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
}
buf.reverse();// 倒叙排列
return buf.toString();
}
2.把N进制数转成10进制数:按权展开
(1)这里的权就是N的ex次幂,例如2进制:1110=1*2^3+1*2^2+1*2^1+0*2^0 =8+4+2+0=14
所以这里需要一个求x的ex次幂的方法,这里用一个自定义的方法:
/**
* 返回x的ex次幂。
* @param x
* 底数
* @param ex
* 幂指数
* @return x的ex次幂
*/
public static int pow(int x, int ex)
{
int result = 1;
for (int i = 0; i < ex; i++)
{
result *= x;
}
return result;
}
当然也可以使用Math.pow()方法
下面是N进制转10进制的按权展开的方法:
/**
* 返回N进制对应的10进制数。
*
* @param N_num
* N进制数
* @param radix
* N进制计数
* @return N进制数对应的10进制数
*/
public static int stringNTo10(String N_num, int radix)
{
StringBuilder stringBuilder = new StringBuilder(N_num);
stringBuilder.reverse();// 反转字符,为了把权重最大的放在最右边,便于下面从左到右遍历,根据下标求权重。
//如果不反转,从右向左遍历(从字符串下标大的一端)也可以
char bitCh;
int result = 0;
for (int i = 0; i < stringBuilder.length(); i++)
{
bitCh = stringBuilder.charAt(i);
if (bitCh >= '0' && bitCh <= '9')
{
// '0'对应的ASCII码整数:48
result += (int) (bitCh - '0') * pow(radix, i);
} else if (bitCh >= 'A' && bitCh <= 'Z')
{
// 减去'A'的ASCII码值(65),再加上10
result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
} else if (bitCh >= 'a' && bitCh <= 'z')
{
// 减去'a'的ASCII码值(97),再加上10
result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
}
}
return result;
}
有了这两个核心的方法,其他的方法如十进制转2进制,十进制转8进制,十进制转16进制。N进制转M进制都可调用上面的两个方法来实现了:
3.N进制转M进制方法:
/**
* 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
* 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
*
* @param nRadixNum
* n进制数
* @param nRadix
* n进制的基数
* @param mRadix
* 要转成的进制数基数m
* @return m进制数字符串
*/
public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
{
return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
}
4.10进转2进制,10进制转8进制,10进制转16进制,调用十进制转N进制方法即可public static String string10To2(int tenRadixNum)
{
return string10ToN(tenRadixNum, 2);
}
public static String string10To8(int tenRadixNum)
{
return string10ToN(tenRadixNum, 8);
}
public static String string10To16(int tenRadixNum)
{
return string10ToN(tenRadixNum, 16);
}
5.同理2进制转10进制,8进制转10进制,16进制转10进制,也只要调用N进制转10进制的方法即可,这里不再累赘。
6.整个代码:
package lan.java.jinzhizhuanhuan;
public class TheMoronicCowmpouter
{
public static void main(String[] args)
{
String HexNum = "f9";
System.out.println(
"16进制数:" + HexNum + "对应的2 进制数:" + stringNToM(HexNum, 16, 2));
System.out.println(
"16进制数:" + HexNum + "对应的10进制数:" + string16To10(HexNum));
System.out.println(
"16进制数:" + HexNum + "对应的32进制数:" + stringNToM(HexNum, 16, 32));
}
/**
* 返回N进制对应的10进制数。
*
* @param N_num
* N进制数
* @param radix
* N进制计数
* @return N进制数对应的10进制数
*/
public static int stringNTo10(String N_num, int radix)
{
StringBuilder stringBuilder = new StringBuilder(N_num);
stringBuilder.reverse();// 反转字符
char bitCh;
int result = 0;
for (int i = 0; i < stringBuilder.length(); i++)
{
bitCh = stringBuilder.charAt(i);
if (bitCh >= '0' && bitCh <= '9')
{
// '0'对应的ASCII码整数:48
result += (int) (bitCh - '0') * pow(radix, i);
} else if (bitCh >= 'A' && bitCh <= 'Z')
{
// 减去'A'的ASCII码值(65),再加上10
result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
} else if (bitCh >= 'a' && bitCh <= 'z')
{
// 减去'a'的ASCII码值(97),再加上10
result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
}
}
return result;
}
public static int string2To10(String tenRadixNum)
{
return stringNTo10(tenRadixNum, 2);
}
public static int string8To10(String tenRadixNum)
{
return stringNTo10(tenRadixNum, 8);
}
public static int string16To10(String tenRadixNum)
{
return stringNTo10(tenRadixNum, 16);
}
/**
* 返回x的ex次幂。
*
* @param x
* 底数
* @param ex
* 幂指数
* @return x的ex次幂
*/
public static int pow(int x, int ex)
{
int result = 1;
for (int i = 0; i < ex; i++)
{
result *= x;
}
return result;
}
/**
* 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
*
* @param tenRadix
* 十进制整数
* @param radix
* 要转换的进制数,例如,要转成2进制数,radix就传入2
* @return radix进制的字符串
*/
public static String string10ToN(int tenRadix, int radix)
{
// 进制编码支持9+26=35进制
String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder buf = new StringBuilder();
int remainder = 0;
while (tenRadix != 0)
{
remainder = tenRadix % radix;// 求余数
tenRadix = tenRadix / radix;// 除以2
buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
}
buf.reverse();// 倒叙排列
return buf.toString();
}
public static String string10To2(int tenRadixNum)
{
return string10ToN(tenRadixNum, 2);
}
public static String string10To8(int tenRadixNum)
{
return string10ToN(tenRadixNum, 8);
}
public static String string10To16(int tenRadixNum)
{
return string10ToN(tenRadixNum, 16);
}
/**
* 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
* 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
*
* @param nRadixNum
* n进制数
* @param nRadix
* n进制的基数
* @param mRadix
* 要转成的进制数基数m
* @return m进制数字符串
*/
public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
{
return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
}
}
运行结果:
16进制数:f9对应的2 进制数:11111001
16进制数:f9对应的10进制数:249
16进制数:f9对应的32进制数:7P
这上面只支持到9+26=35进制以内的整数之间的进制相互转换,大于35进制的我不方便符号化就算了,知道进制转换的原理就行了,主要是10进制转N进制,以及N进制转10进制这两个重要的转换方法。