您的位置:首页 > 其它

任意的进制转换

2013-04-17 10:06 197 查看
 

 

2013-4-11号,周四,我去搜狗面试的做的一道笔试题:把一个二进制的数转换成十六进制数,当时怎么也想不起来如何做?想着这样:先转换成十进制,再转换成十六进制。所以涉及到了进制间转换的问题。

 

计算机中采用的是二进制,一个数字可以用任意进制表示。

关键技术剖析:

v Java中在声明数字时默认采用的是十进制,可以在数字前加上符号表示数字采用八进制【前面加0(零)】或者十六进制【前面加上0x(零x)】。

v Java的整型封装类Integer和Long提供toString(int i,int radix)静态方法,可以将一个任意进制的整数转换为其他进制的整数。

v 使用Integer或Long的toBinaryString方法将整数转换为二进制。

v 使用Integer或Long的toOctalString方法将整数转换为八进制。

v 使用Integer或Long的toHexString方法将整数转换为十六进制。

v 使用Integer或Long的toString(int i)方法可以将其他进制的整数转换为十进制的整数的字符串表示。

 

public class SystemConversion {

public static void main(String[] args) {

int iOct = 0567;//八进制数字的声明,在前面加上0(零)

int iTen = 1000;//十进制数字的声明

int iHex = 0xAbcd;//十六进制数字的声明,在前面加上0x(零x),x和abcd不区分大小写

 

System.out.println("八进制0567装换成二进制:Integer.toString(iOct, 2)="+Integer.toString(iOct, 2));

System.out.println("八进制0567装换成二进制:Integer.toBinaryString(iOct)="+Integer.toBinaryString(iOct));

System.out.println("八进制0567装换成十进制:Integer.toString(iOct, 10)="+Integer.toString(iOct, 10));

System.out.println("八进制0567装换成十进制:Integer.toString(iOct)="+Integer.toString(iOct));

System.out.println("八进制0567装换成十六进制:Integer.toString(iOct, 2)="+Integer.toString(iOct, 16));

System.out.println("八进制0567装换成十六进制:Integer.toHexString(iOct)="+Integer.toHexString(iOct));

 

System.out.println();

 

System.out.println("十进制1000装换成十六进制:Integer.toString(iTen,16)="+Integer.toString(iTen,16));

System.out.println("十进制1000装换成十六进制:Integer.toHexString(iTen)="+Integer.toHexString(iTen));

System.out.println("十进制1000装换成八进制:Integer.toString(iTen,8)="+Integer.toString(iTen,8));

System.out.println("十进制1000装换成八进制:Integer.toOctalString(iTen)="+Integer.toOctalString(iTen));

System.out.println("十进制1000装换成二进制:Integer.toString(iTen,2)="+Integer.toString(iTen,2));

System.out.println("十进制1000装换成二进制:Integer.toBinaryString(iTen)="+Integer.toBinaryString(iTen));

 

System.out.println();

 

System.out.println("十六进制0xAbcd装换成十进制:Integer.toString(iHex,10)="+Integer.toString(iHex,10));

System.out.println("十六进制0xAbcd装换成十进制:Integer.toString(iHex)="+Integer.toString(iHex));

System.out.println("十六进制0xAbcd装换成八进制:Integer.toString(iHex,8)="+Integer.toString(iHex,8));

System.out.println("十六进制0xAbcd装换成八进制:Integer.toOctalString(iHex)="+Integer.toOctalString(iHex));

System.out.println("十六进制0xAbcd装换成二进制:Integer.toString(iHex,2)="+Integer.toString(iHex,2));

System.out.println("十六进制0xAbcd装换成二进制:Integer.toBinaryString(iHex)="+Integer.toBinaryString(iHex));

 

System.out.println();

//还可将任意进制的整数装换成其他任意进制的数字

System.out.println("十六进制0xAbcd装换成七进制:Integer.toString(iHex,7)="+Integer.toString(iHex,7));

 

}

}

 

程序输出:

八进制0567装换成二进制:Integer.toString(iOct, 2)=101110111

八进制0567装换成二进制:Integer.toBinaryString(iOct)=101110111

八进制0567装换成十进制:Integer.toString(iOct, 10)=375

八进制0567装换成十进制:Integer.toString(iOct)=375

八进制0567装换成十六进制:Integer.toString(iOct, 2)=177

八进制0567装换成十六进制:Integer.toHexString(iOct)=177

十进制1000装换成十六进制:Integer.toString(iTen,16)=3e8

十进制1000装换成十六进制:Integer.toHexString(iTen)=3e8

十进制1000装换成八进制:Integer.toString(iTen,8)=1750

十进制1000装换成八进制:Integer.toOctalString(iTen)=1750

十进制1000装换成二进制:Integer.toString(iTen,2)=1111101000

十进制1000装换成二进制:Integer.toBinaryString(iTen)=1111101000

十六进制0xAbcd装换成十进制:Integer.toString(iHex,10)=43981

十六进制0xAbcd装换成十进制:Integer.toString(iHex)=43981

十六进制0xAbcd装换成八进制:Integer.toString(iHex,8)=125715

十六进制0xAbcd装换成八进制:Integer.toOctalString(iHex)=125715

十六进制0xAbcd装换成二进制:Integer.toString(iHex,2)=1010101111001101

十六进制0xAbcd装换成二进制:Integer.toBinaryString(iHex)=1010101111001101

十六进制0xAbcd装换成七进制:Integer.toString(iHex,7)=242140

 

 

分析下java内部如何实现进制的转换的

十进制转换为二进制:

看算法之前我们先了解下java的移位运算:

移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

  在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。

386 以后的硬件把移位对字长进行取模,右移32位就是右移了0位(CPU 把右移的位数 32 对于字长 32 进行取模运算,得到 0),因此 9 右移 32 位仍然是 9。你可以换一下for循环的条件,比如换成i<=64,你会发现结果是一样的。

由于Unicode兼容ASCII(0~255),因此,上面得到的Unicode就是ASCII。

至于转换成二进制或其他进制,Java API提供了方便函数,你可以查Java的API手册。
 

 

学习下原理,否则永远都不会。

十进制转换为其它进制:

10进制转换成其他的都是除以要转换成的那个数,也就是说转换成二进制的就除以2,转换成八进制的就除以8,转换成十六进制的就除以16,然后倒取余数。具体例题如下

10---2:把20转换成二进制

20/2=10..........余数为0

10/2=5...........余数为0

5/2=2............余数为1

2/2=1............余数为0

1/2=0............余数为1

则20换成二进制后是10100

10---8:把20转换成八进制

20/8=2...........余数为4

2/8=0............余数为2

则20转换成八进制后是24

10---16:把20转换成十六进制

20/16=1..........余数为4

1/16=0...........余数为1

则20转换成十六进制后是14

其它进制转换为十进制:

2---10:把二进制数1101转换成十进制

1101=1*2的0次方+0*2的1次方+1*2的2次方+1*2的3次方=13

则1101变成十进制后是13

8---10:把八进制数1340转换成十进制

1340=0*8的0次方+4*8的1次方+3*8的2次方+1*8的3次方=736

则1340变成十进制后是736

16---10:把十六进制数3A4F转换成十进制

3A4F=15*16的0次方+4*16的1次方+10*16的2次方+3*16的3次方=14927

(十六进制中的A是10,F是15)

 

 

二、十六进制数互相转换
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
只要把十六进制对照的二进制码记住,十六进一看就转换出来了.
二、八进互相转换
二进制数要转换为八进制,就是以3位一段,分别转换为八进制,

二进制与八进制的相互转换:

八进制数 0 1 2 3 4 5 6 7

二进制数 000 001 010 011 100 101 110 111

二进制与十六进制的相互转换:

十六进制 0 1 2 3 4 5 6 7 B

二进制数 0000 0001 0010 0011 0100 0101 0110 0111 1011

 

二进制与十六进制的关系
2进制 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
16进制 0 1 2 3 4 5 6 7 8 9 a(10) b(11) c(12) d(13) e(14) f(15)
可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为:
3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102
右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。

 

package com.jinzhizhuanhuan;

/**
* 功能:将一个数从M进制转换成N进制
* MValue:M进制数的字符串表示方法
* Shang:保存中间运算结果
* M:M进制 N:N进制
*/
public class M2N {
// 在这里对输入赋值
public static String MValue = "15";
public static String Shang = null;
public static int M = 10;
public static int N = 2;

public static void main(String[] args) {
String nValue = "";
Shang = MValue;
while (Shang.length() > 0) {
nValue = qiuyu(Shang) + nValue;
}
System.out.println(nValue);
}

/**
* 功能:对给定的M进制字符串对n求余。
*
* @param MTempValue
* @param m
* @param n
* @return
*/
public static String qiuyu(String MTempValue) {
Shang = "";
int temp = 0;
while (MTempValue.length() > 0) {
int t = getIntFromStr(MTempValue.substring(0, 1));
MTempValue = MTempValue.substring(1);
temp = temp * M + t;
Shang += getStrFromInt(temp / N);
temp = temp % N;
}
while (Shang.length() > 0 && Shang.charAt(0) == '0') {
Shang = Shang.substring(1);
}
return getStrFromInt(temp);
}

public static int getIntFromStr(String str) {
return str.charAt(0) <= '9' && str.charAt(0) >= '0' ? str.charAt(0) - '0'
: str.charAt(0) - 'a' + 10;
}

public static String getStrFromInt(int value) {
String result = null;
if (value >= 0 && value <= 9)
result = String.valueOf((char) ('0' + value));
else if (value > 9 && value < 36) {
result = String.valueOf((char) ('a' + value - 10));
} else {
result = "-1";// 出错误了
}
return result;
}

}


 

 

 参考链接:

 http://www.cnblogs.com/pkuoliver/archive/2010/10/27/Convert-m-number-to-n-number.html

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: