任意的进制转换

 

 

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

 

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

关键技术剖析:

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

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

使用IntegerLongtoBinaryString方法将整数转换为二进制。

使用IntegerLongtoOctalString方法将整数转换为八进制。

使用IntegerLongtoHexString方法将整数转换为十六进制。

使用IntegerLongtoString(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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值