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



猜你喜欢

转载自blog.csdn.net/qq_21808961/article/details/80515559