• Float与二进制之间的转化(Java实现)


    在线转化: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 }

    //目前精度还是不够,误差较大。
  • 相关阅读:
    [AS3 3D Demo] Stage3D学习过程中开发的3个Demo
    NGUI学习笔记(一):官方视频学习记录
    关于继承MonoBehaviour的一些记录
    Jquery js框架使用
    Highcharts 图表js框架
    js上传控件 plupload 使用记录
    关于 web中 使用 java.net.URLEncoder.encode 要编码两次呢 , js的encodeURIComponent 同理
    跑测试没有web环境的情况
    sitemesh 学习之 meta 引入
    sitemesh 2.4 装饰器学习
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/9906351.html
Copyright © 2020-2023  润新知