在一次面试的过程中,遇到过这样的题目,题目的大概意思是:让写出Integer类中的toBinaryString()方法
也就是说,把Integer转换为Binary的过程写出来
但是我蒙的,在查了JDK的源码,发现了这个很好用的方法,在此给大伙看看
下面是我做的一个测试:
1 /** 2 * 3 */ 4 package com.b510.test; 5 6 /** 7 * @author Hongten 8 * @date 2013-12-15 9 */ 10 public class TestF { 11 12 public static void main(String[] args) { 13 //output:1000 14 System.out.println(toBinaryString(8)); 15 //printInfo(); 16 } 17 18 /** 19 * 这里是做&操作的测试,也就是说,在1&*(其中*代表其他数字,如:0,1,2,3,4...)操作的时候 20 * 他们是进行二进制之间的&(与)运算操作。只有当*为奇数(1,3,5,7...)的时候,1*&操作才可以返回:1 21 * 其他情况返回:0 22 */ 23 private static void printInfo(){ 24 for(int i =0; i< 10; i++){ 25 System.out.println("i= " + i + " "+(i & 1)); 26 } 27 /* 28 output: 29 i= 0 0 30 i= 1 1 31 i= 2 0 32 i= 3 1 33 i= 4 0 34 i= 5 1 35 i= 6 0 36 i= 7 1 37 i= 8 0 38 i= 9 1 39 */ 40 } 41 42 public static String toBinaryString(int i) { 43 return toUnsignedString(i, 1); 44 } 45 46 /** 47 * Convert the integer to an unsigned number. 48 */ 49 private static String toUnsignedString(int i, int shift) { 50 char[] buf = new char[32]; 51 int charPos = 32; 52 int radix = 1 << shift; 53 int mask = radix - 1; 54 do { 55 //这里的mask一直为:1,所以当i为奇数的时候,这里"i & mask"操作才为:1 56 //否则返回:0 57 //System.out.println(i & mask); 58 buf[--charPos] = digits[i & mask]; 59 i >>>= shift;//右移赋值,左边空出的位以0填充 60 //System.out.println(buf); 61 //System.out.println(charPos); 62 //System.out.println(i); 63 } while (i != 0); 64 return new String(buf, charPos, (32 - charPos)); 65 } 66 67 final static char[] digits = { 68 '0' , '1' , '2' , '3' , '4' , '5' , 69 '6' , '7' , '8' , '9' , 'a' , 'b' , 70 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 71 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 72 'o' , 'p' , 'q' , 'r' , 's' , 't' , 73 'u' , 'v' , 'w' , 'x' , 'y' , 'z' 74 }; 75 }
在代码中,其实我们可以简化一下digits数组,因为我们只会用到数组:digits[0],digits[1]
所以:
1 final static char[] digits = { 2 '0' , '1' 3 };
方法里面用到了移位操作和&操作,这两个操作是关键。
========================================================
More reading,and english is important.
I'm Hongten
大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
Hongten博客排名在100名以内。粉丝过千。
Hongten出品,必是精品。
E | hongtenzone@foxmail.com B | http://www.cnblogs.com/hongten
========================================================