java 实现N进制转M进制
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进制这两个重要的转换方法。