Java实现IEEE754 32Bits单精度二进制转化

在线转化http://www.binaryconvert.com

2 3 import java.text.DecimalFormat; 4 5 /** 6 * IEEE754 32 bit single precision float 7 * 8 * @date 2018 .11 .4 9 */ 10 public class SinglePrecision { 11 public String FloatToBinary(double n) { 12 int signBit;//符号位 13 // String s = Float.toString((float) n); 这个方法居然会自动用 科学记数法4.52E-4------------------------------------ 14 String s = (new DecimalFormat("###################.######")).format(n); 15 16 /** 17 * 处理符号位 18 * 本来是有正负0的,这个地方就默认是正0了 19 */ 20 if (n == 0) { 21 signBit = 0; 22 } else if (n < 0) { 23 signBit = 1; 24 s = s.substring(1);//把负号去掉 25 } else { 26 signBit = 0; 27 } 28 29 /** 30 * 不用判断是小数还是整数,Float.toString()会自动在整数后补0,0也一样 31 * 将整数部分小数部分分开: 32 */ 33 String intFloat[] = s.split("\\."); 34 int intPart = Integer.valueOf(intFloat[0]); 35 float floatPart = Float.valueOf("0." + intFloat[1]); 36 System.out.println(s); 37 System.out.println(intPart); 38 //处理整数部分 39 boolean isReady = false; 40 String str_intpart = ""; //以1开头的二进制数 如10——>1010,而不是32位 41 for (int i = 31; i >= 0; i--) { // ???应该是从31开始吧-------------------妈的 42 if (((intPart >> i) & 1) == 1) { 43 isReady = true; 44 } 45 if (isReady) { 46 str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0; 47 } 48 } 49 50 //处理小数部分——乘2取整法 51 String str_floartPart = ""; 52 while (floatPart != 0) { 53 floatPart *= 2; 54 if (floatPart >= 1) { 55 floatPart -= 1; 56 str_floartPart += 1; 57 } else str_floartPart += 0; 58 } 59 60 /** 61 * 规格化 62 */ 63 String str_int_float = str_intpart + str_floartPart; //现在得到二进制下的:"整数(.)小数"格式。考虑规格化 64 int diff = 0;// 规格化所要将小数部分移动的位数,主要是针对整数部分为0的 65 int intlen = str_intpart.length(); 66 str_intpart = str_int_float.substring(0, 1); 67 str_floartPart = str_int_float.substring(1); 68 while (str_intpart.charAt(0) != '1') { 69 str_intpart = str_floartPart.substring(0, 1); 70 str_floartPart = str_floartPart.substring(1); 71 diff++; 72 } 73 74 int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //规格化所带来的指数的移动 75 76 //得到8位指数部分; 77 int exponential = expChange + 127;//真正的指数 78 String exp = ""; //指数 79 for (int i = 7; i >= 0; i--) { 80 exp += ((exponential >> i) & 1) == 1 ? 1 : 0; 81 } 82 83 //得到23位底数部分 84 String base = str_floartPart; 85 int len = base.length(); 86 for (int i = 0; i < 23 - len; i++) { 87 base += 0; 88 } 89 90 return signBit + " " + exp + " " + base; 91 } 92 93 public static void main(String[] args) { 94 SinglePrecision sp = new SinglePrecision(); 95 System.out.println(sp.FloatToBinary(0.56250001212)); 96 } 97 }

猜你喜欢

转载自www.cnblogs.com/XT-xutao/p/9906351.html