在线转化:http://www.binaryconvert.com
2
3 import java.text.DecimalFormat; 4
5
6 public class SinglePrecision { 7
8 //浮点到二进制
9 public String Float2Binary(double n) {//使用double输入,不影响
10 int signBit;//符号位 11 // String s = Float.toString((float) n); 这个方法会自动用 科学记数法4.52E-4
12 String s = (new DecimalFormat("################.######")).format(n); 13
14 /**
15 * 处理符号位 16 * 本来是有正负0的,这个地方就默认是正0了 17 */
18 if (n == 0) { 19 signBit = 0; 20 } else if (n < 0) { 21 signBit = 1; 22 s = s.substring(1);//把负号去掉
23 } else { 24 signBit = 0; 25 } 26
27 /**
28 * 不用判断是小数还是整数,Float.toString()会自动在整数后补0,0也一样 29 * 将整数部分小数部分分开: 30 */
31 String intFloat[] = s.split("\\."); 32 int intPart = Integer.valueOf(intFloat[0]); 33 float floatPart = Float.valueOf("0." + intFloat[1]); 34 // System.out.println(s); 35 // System.out.println(intPart); 36 //处理整数部分
37 boolean isReady = false; 38 String str_intpart = ""; //以1开头的二进制数 如10——>1010,而不是32位
39 for (int i = 31; i >= 0; i--) { //
40 if (((intPart >> i) & 1) == 1) { 41 isReady = true; 42 } 43 if (isReady) { 44 str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0; 45 } 46 } 47
48 //处理小数部分——乘2取整法
49 String str_floartPart = ""; 50 while (floatPart != 0) { 51 floatPart *= 2; 52 if (floatPart >= 1) { 53 floatPart -= 1; 54 str_floartPart += 1; 55 } else str_floartPart += 0; 56 } 57
58 /**
59 * 规格化 60 */
61 String str_int_float = str_intpart + str_floartPart+"0000000000000000000000000000000"; //补0是因为可能不够长 62 //现在得到二进制下的:"整数(.)小数"格式。考虑规格化
63 int diff = 0;// 规格化所要将小数部分移动的位数,主要是针对整数部分为0的
64 int intlen = str_intpart.length(); 65 str_intpart = str_int_float.substring(0, 1); 66 str_floartPart = str_int_float.substring(1,23); 67 while (str_intpart.charAt(0) != '1') { 68 str_intpart = str_floartPart.substring(0, 1); 69 str_floartPart = str_floartPart.substring(1); 70 diff++; 71 } 72
73 int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //规格化所带来的指数的移动 74
75 //得到8位指数部分;
76 int exponential = expChange + 127;//真正的指数
77 String exp = ""; //指数
78 for (int i = 7; i >= 0; i--) { 79 exp += ((exponential >> i) & 1) == 1 ? 1 : 0; 80 } 81
82 //得到23位底数部分
83 String base = str_floartPart; 84 int len = base.length(); 85 for (int i = 0; i < 23 - len; i++) { 86 base += 0; 87 } 88
89 return signBit + " " + exp + " " + base; 90 } 91
//二进制到浮点小数
92 public double binary2Float (String binary){ 93 if (binary.length()!=32) { 94 System.out.println("Error!"); 95 return 0; 96 } 97 String exp = binary.substring(1,9); 98 String base = "1"+binary.substring(9); 99 /**
100 * 分类: 101 * 底数全是0 102 */
103 double Base = 0; 104 int Exp = Integer.valueOf(exp,2)-127; 105 for (int i =0;i<24;i++){ 106 Base+=(base.charAt(i)=='1'?Math.pow(2,-i):0); 107 } 108 return Base*Math.pow(2,Exp); 109 } 110
111 public static void main(String[] args) { 112 SinglePrecision sp = new SinglePrecision(); 113 System.out.println(sp.Float2Binary(256.9375)); 114 System.out.println(sp.binary2Float("01000011100000000111100000000000")); 115
116 /**
117 * output: 118 * 0 10000111 00000000111100000000000 119 * 256.9375 120 */
121
122 } 123 }
//目前精度还是不够,误差较大。