从JDK源码分析Java进制转换

二进制、八进制、十进制、16进制数之间的转换题型是经常出现的笔试面试题。关于进制之间的转换也有很多好的算法,在Java中Integer类提供了int类型数据的进制转换。

JDK中Integer类提供了把整形数值转换二进制、八进制以及十进制的实现方法。

具体实现分析

1、十进制 转 二进制

public class Test {
	
	final static char[] digits = { '0' , '1' };
	
	public static void main(String[] args) {
		int aa =20;
		String str = toUnsignedString(aa);
		System.out.println(str);
		
	}
	
	private static String toUnsignedString(int i) {
	    int shift = 1; //每次右移1位
		char[] buf = new char[32];
		int charPos = 32;
		int radix = 1 << shift;
		int mask = radix - 1;
		do {
		    buf[--charPos] = digits[i & mask]; //&二进制按位与
		    i >>>= shift;  //无符号右移1位,相当于手算的时候把i除以2,结果再赋予i
		} while (i != 0);
	
		return new String(buf, charPos, (32 - charPos)); //截取返回有效部分
    }
}
示例中使用了移位操作,关于移位操作点击《Java移位操作》
相应的也可把int类型转成八进制、十六进制,只需改变偏移位shift的大小即可。

public class DecimalismToOctonary {

	final static char[] digits = {
		'0' , '1' , '2' , '3' , '4' , '5' ,
		'6' , '7' , '8' , '9' , 'a' , 'b' ,
		'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
		'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
		'o' , 'p' , 'q' , 'r' , 's' , 't' ,
		'u' , 'v' , 'w' , 'x' , 'y' , 'z'
	};
	
	public static String toOctonary(int i,int shift) {
		char[] buf = new char[32];
		int charPos = 32;
		int radix = 1 << shift;
		int mask = radix - 1;
		do {
		    buf[--charPos] = digits[i & mask]; //&二进制按位与
		    i >>>= shift;  //无符号右移1位,相当于手算的时候把i除以shift,结果再赋予i
		} while (i != 0);
		return new String(buf, charPos, (32 - charPos));
	}
	
	public static void main(String[] args) {
		int a = 620;
		String str1 = toOctonary(a,1); //偏移1位,转成2进制
		String str2 = toOctonary(a,3); //偏移3位,转成8进制(2的3次方)
		String str3 = toOctonary(a,4); //偏移4位,转成16进制
		System.out.println(str1);
		System.out.println(str2);
		System.out.println(str3);
	}
}

利用一位操作来进行的运算操作更利于计算机的运算,因此效率与我们使用加减乘除之类的运算相比要更好。


你可能感兴趣的:(Java)