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