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

2023-11-19

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

//目前精度还是不够,误差较大。

 

转载于:https://www.cnblogs.com/XT-xutao/p/9906351.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Float与二进制之间的转化(Java实现) 的相关文章

  • 可序列化对象的 ArrayList 的加密保存和解密加载

    我在 SD 卡中保存并加载一个文件 其中包含ArrayList使用这两种方法的可序列化对象 保存方法 public static void saveUserList ArrayList
  • JSF2.0 中的空白输入字段未设置为 NULL

    我有一个支持 bean 其中 fileld 为 Long Double Integer String 当我没有在输入字段中指定任何内容时 长整型 整数和双精度值将被视为零 而不是空 我正在使用 tomcat 来部署我的应用程序 有什么解决办
  • 在 Spark 中写入 JSON 时保留具有空值的键

    我正在尝试使用 Spark 编写 JSON 文件 有一些键有null作为价值 这些在中显示得很好DataSet 但是当我写入文件时 密钥会丢失 我如何确保它们被保留 写入文件的代码 ddp coalesce 20 write mode ov
  • Java 比 Xmx 参数消耗更多内存

    我有一个非常简单的 Web 服务器类 基于 Java SEHttpServer class 当我使用此命令启动编译的类来限制内存使用时 java Xmx5m Xss5m Xrs Xint Xbatch Test 现在如果我使用检查内存top
  • 如何创建仅接受字母数字字符的正则表达式? [复制]

    这个问题在这里已经有答案了 可能的重复 字母数字和下划线的正则表达式 https stackoverflow com questions 336210 regular expression for alphanumeric and unde
  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • 使用 Copy.CopyIntoItems Web 服务将文件上传到 SharePoint 2010 时收到 400 错误请求

    SharePoint 新手 我尝试使用 Java 的 CopyIntoItems Web 服务方法将文档上传到 SharePoint 但不断收到 400 错误请求 我使用 Java 的 wsimport 从 wsdl 文件生成类文件 这是我
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • java内存不足然后退出

    我有一个必须分析大文件的软件 限制输入或提供无限内存都不是一个选择 所以我必须忍受飞行的 OOME 因为 OOME 只杀死线程 所以我的软件运行在一些糟糕的状态 从外面看一切都很好 因为进程正在运行 但在内部却是脑死亡 我想拔掉它的插头 但
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • 在 Hibernate 的 XML 配置文件中指定默认值

    我通过映射配置文件配置 Hibernate
  • 为什么我无法使用 HttpUrlConnection 上传第一个文件块?

    在我的项目中 我应该从一台服务器逐块下载文件 并将每个块立即上传到另一台服务器 我有一个应该下载的文件的 URL 我们就这样称呼它吧downloadUrl 因此 这就是我逐块下载文件的方式 val chunkSize 1024 1024 B
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • 使用 ProcessBuilder 启动 CMD

    我尝试使用以下代码在 Windows 中启动 CMD 应用程序 但它无法按预期工作 来自不同网站的几个示例表明 cmd 作为 ProcessBuilder 构造中的参数应该有效 我需要做什么才能让我的 Java 应用程序在 Windows
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection

随机推荐

  • 从0到1搭建自己的脚手架(java后端)

    一 脚手架是什么 脚手架是一种基础设施工具 用于快速生成项目的框架代码和文件结构 它是一种标准化的开发工具 使开发人员能够在项目的早期阶段快速搭建出一个具备基本功能和结构的系统 二 脚手架的意义 主流的微服务架构体系下很多公司会将原有的单体
  • SPSS 24安装后怎么打开的问题

    本人安装完spss 24之后打开发现还是需要许可证 再次输入完成就会全部关闭 解决方法 安装的步骤基本不会有问题 主要是针对出现安装完成 也填好许可证了的情况 可以通过下图对应的文件位置 双击打开 就可以使用了 安装包和教程可参考 链接 l
  • 多线程2(同步代码块+同步方法+同步锁+死锁)

    一 多线程同步 多线程的并发执行可以提高程序的效率 但是当多个线程去访问同一个资源时 有时也会引发一些安全性问题 例如 统计一个班上的学生人数时 学生有进有出会影响最终学生人数 为了解决这样的问题 需要实现多线程的同步 即限制某个资源在同一
  • 夯实C++基础之刷题:链表——相交链表

    一点点进步计划 首先要坚持刷题 刷题是一个将思路用代码实现的过程 2要自己看知识点 平时也看看面经 这样才与时俱进 先从每天能做一道题开始把 题目 1 相交链表 2 思路 看问题解析都用到了数学的双指针的方法 我是想不明白 但看解题的意思是
  • 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计...

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中 特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题 业务数据库中的一些数据发生了更改 到底要不要将这些变化也反映到数据仓库中 在数据仓库中 哪些数据应该随之变化
  • STM32 USB HID 自定义设备 bulk 传输

    ST 意法半导体公司 为STM32系列处理器编写了外设USB的库 并提供了很好的参考例程 本文就是参考ST提供的例程 在STM32F4 discovery板子上实现usb bulk传输 Host端是在linux平台上利用libusb库函数写
  • mysql 临时表权限_MySQL临时表浅析

    一 MySQL如何使用内部临时表 在某些情况下 服务器会在处理query的时候组建内部临时表 这种表有两种存在形式 1 位于内存中 使用的是MEMORY存储引擎 内存临时表 2 位于磁盘上 使用MyISAM存储引擎 硬盘临时表 服务器可能在
  • 再介绍一种低成本的负电源电路

    前面介绍了几种产生负电源的方法 几种常用的产生负电源的方法 今天再来介绍一种低成本的负电源电路 用分离元件搭建 配合程序控制 实现正电源转负电源 先看电路 图中Q1 D1 L2和C1构成最基本的Buck Boost电路 L1 C2为一级LC
  • myeclipse非正常关闭处理办法

    myeclipse正常或非正常关闭后 再次运行 不显示启动时的logo和读条 进入主页面后程序基本就卡死 无法正常运行 解决办法 方法一 修改工作空间在刚启动Myeclipse的时候会有一个选择工作空间的地方 换一个新的工作空间即可 若是原
  • Redis7之介绍(一)

    一 介绍 1 1 基本了解 Remote Dictionary Server 远程字典服务 是完全开源的 使用ANSIC语言编写遵守BSD协议 是一个高性能的Key Value数据库提供了丰富的数据结构 例如String Hash List
  • 面试题: v-if和v-show有什么区别?

    面试题 v if和v show有什么区别 1 v if能够控制是否生成vnode 也就间接控制了是否生成对应的dom 当v if为true时 会生成对应的vnode 并生成对应的dom元素 当其为false时 不会生成对应的vnode 自然
  • openwrt 缺少 libc.so.6 libm.so.6 libpthread.so.0

    在开发openwrt时 编译内核的时候 自己写的代码在openwrt 编译报错 提示缺少依赖库文件 Package Gateway Auto is missing dependencies for the following librari
  • flutter版本号对比

    版本号对比 Future
  • 筛选素数之欧拉筛法 python实现 附带证明

    返回类型 列表 说明 返回小于upperBound的所有素数 def ouLaShai upperBound filter False for i in range upperBound 1 primeNumbers for num in
  • Java学习心得10——多态

    多态 一种类型的变量可以掌管多种类型的对象 这就是多态 说人话 直观理解成多种形态 人类就是多态的 黄种人 白种人 黑种人都是属于人类 人类这一个类可以表示黄种人 白种人 黑种人这三个类 这不就是多态多种形态吗 回到编程 Animal 动物
  • 【华为OD机试真题 python】数字加减游戏【2022 Q4

    题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 在每个回合中 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用
  • 第四章 Flume专题-日志采集工具

    一 Flume专题之组件及架构介绍 1 Flume概述 1 1 Flume定义 Flume是一种分布式的 高可靠的和高可用的服务 用于有效地收集 聚合和移动大量日志数据框架 Flume是一个简单灵活的基于流数据的体系结构 1 2 Flume
  • Delphi ListView 的用法

    Delphi ListView 的用法 常用技巧 增加 i ListView1 Items Count with ListView1 do begin ListItem Items Add ListItem Caption IntToStr
  • Vite搭建react+ts项目

    创建一个react项目 首先需要打开终端 进行vite的引入 yarn create vite 使用react模板创建项目 yarn create vite react test template react cd react test y
  • Float与二进制之间的转化(Java实现)

    在线转化 http www binaryconvert com 2 3 import java text DecimalFormat 4 5 6 public class SinglePrecision 7 8 浮点到二进制 9 publi