Java實現IEEE754 32Bits單精度二進位制轉化
阿新 • • 發佈:2018-11-04
線上轉化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 }