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進制這兩個重要的轉換方法。