Float与二进制之间的转化(Java实现)
在线转化:http://www.binaryconvert.com
import java.text.DecimalFormat;
public class SinglePrecision {
//浮点到二进制
public String Float2Binary(double n) {//使用double输入,不影响
int signBit;//符号位
// String s = Float.toString((float) n); 这个方法会自动用 科学记数法4.52E-4
String s = (new DecimalFormat("################.######")).format(n);
/**
* 处理符号位
* 本来是有正负0的,这个地方就默认是正0了
*/
if (n == 0) {
signBit = 0;
} else if (n < 0) {
signBit = 1;
s = s.substring(1);//把负号去掉
} else {
signBit = 0;
}
/**
* 不用判断是小数还是整数,Float.toString()会自动在整数后补0,0也一样
* 将整数部分小数部分分开:
*/
String intFloat[] = s.split("\\.");
int intPart = Integer.valueOf(intFloat[0]);
float floatPart = Float.valueOf("0." + intFloat[1]);
// System.out.println(s);
// System.out.println(intPart);
//处理整数部分
boolean isReady = false;
String str_intpart = ""; //以1开头的二进制数 如10——>1010,而不是32位
for (int i = 31; i >= 0; i--) { //
if (((intPart >> i) & 1) == 1) {
isReady = true;
}
if (isReady) {
str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0;
}
}
//处理小数部分——乘2取整法
String str_floartPart = "";
while (floatPart != 0) {
floatPart *= 2;
if (floatPart >= 1) {
floatPart -= 1;
str_floartPart += 1;
} else str_floartPart += 0;
}
/**
* 规格化
*/
String str_int_float = str_intpart + str_floartPart+"0000000000000000000000000000000"; //补0是因为可能不够长
//现在得到二进制下的:"整数(.)小数"格式。考虑规格化
int diff = 0;// 规格化所要将小数部分移动的位数,主要是针对整数部分为0的
int intlen = str_intpart.length();
str_intpart = str_int_float.substring(0, 1);
str_floartPart = str_int_float.substring(1,23);
while (str_intpart.charAt(0) != '1') {
str_intpart = str_floartPart.substring(0, 1);
str_floartPart = str_floartPart.substring(1);
diff++;
}
int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //规格化所带来的指数的移动
//得到8位指数部分;
int exponential = expChange + 127;//真正的指数
String exp = ""; //指数
for (int i = 7; i >= 0; i--) {
exp += ((exponential >> i) & 1) == 1 ? 1 : 0;
}
//得到23位底数部分
String base = str_floartPart;
int len = base.length();
for (int i = 0; i < 23 - len; i++) {
base += 0;
}
return signBit + " " + exp + " " + base;
}
//二进制到浮点小数
public double binary2Float (String binary){
if (binary.length()!=32) {
System.out.println("Error!");
return 0;
}
String exp = binary.substring(1,9);
String base = "1"+binary.substring(9);
/**
* 分类:
* 底数全是0
*/
double Base = 0;
int Exp = Integer.valueOf(exp,2)-127;
for (int i =0;i<24;i++){
Base+=(base.charAt(i)=='1'?Math.pow(2,-i):0);
}
return Base*Math.pow(2,Exp);
}
public static void main(String[] args) {
SinglePrecision sp = new SinglePrecision();
System.out.println(sp.Float2Binary(256.9375));
System.out.println(sp.binary2Float("01000011100000000111100000000000"));
/**
* output:
* 0 10000111 00000000111100000000000
* 256.9375
*/
}
}
//目前精度还是不够,误差较大。
Float与二进制之间的转化(Java实现)的更多相关文章
- 十进制二进制之间的转化 PHP算法
[ 十进制转二进制 ] function test($var){ $func = function($i){ if($i < 2){ return $i; } $return['int'] = ...
- java对象与Json字符串之间的转化(fastjson)
1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...
- JAVA 文件与base64之间的转化, 以及Web实现base64上传文件
<1>文件与base64字符串之间的转化 package servlet_file_upload; import java.io.File; import java.io.FileInpu ...
- Java中InputStream和String之间的转化
https://blog.csdn.net/lmy86263/article/details/60479350 在Java中InputStream和String之间的转化十分普遍,本文主要是总结一下转 ...
- java类继承总结一 父类类型与子类类型之间的转化问题(转)
java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...
- java对象与Json字符串之间的转化
public class Test { public static void main(String[] args) { // 实现java对象与Json字符串之间的转化 // 1. Person对象 ...
- json与javabean之间的转化
接着上一个http://www.cnblogs.com/ya-qiang/p/9009134.html随笔,继续介绍json与java对象之间的转化 一.java普通对象和json字符串的互转 jav ...
- python学习,day2:python字符串和二进制之间的互换
在python3中,byte二进制和striing字符串之间不能直接操作,需要进行编码和解码才行.下面是个例子 msg = '我爱北京天安门' print(msg) print(msg.encode( ...
- c++数字和字符之间的转化
关于C++中数与字符之间的转化 在c++中我们经常遇到需要把一个数变成字符,或者把字符变为一个数,c++中没有直接的转化函数,故我们需要自己去写函数去转化,这里我将介绍两种比较简单的方法: 法一: s ...
随机推荐
- Nginx负载均衡session会话保持方法
负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...
- 微信小程序开发(5) 2048游戏
在这篇微信小程序开发教程中,我们将介绍如何使用微信小程序开发2048小游戏. 本文主要分为两个部分,小程序主体部分及小游戏页面部分 一.小程序主体部分 一个小程序主体部分由三个文件组成,必须放在项目的 ...
- GCC编译器原理(二)------编译原理一:ELF文件(3)
4.5 String Table:字符串表 字符串表节区包含以 NULL( ASCII 码 0) 结尾的字符序列, 通常称为字符串. ELF 目标文件通常使用字符串来表示符号和节区名称. 对字符串的引 ...
- 20155324 2016-2017-2 《Java程序设计》第8周学习总结
20155324 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 通用API -** 日志API** 1.~java.util.logging~包提供了日志功 ...
- nginx + iis 使用介绍
1.下载 nginx 2.配置nginx 文件 1)配置该目录下E:\nginx\nginx-1.9.3\conf: #user nobody; worker_processes ; #error_l ...
- DateTime时间格式转换为Unix时间戳格式
/// <summary> /// 将DateTime时间格式转换为Unix时间戳格式 /// </summary> /// <param name="date ...
- Rsync + inotify 实现文件实时同步
Rsync 用来实现触发式的文件同步. Inotify-tools是一套组件,Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取.删除.移动等 ...
- Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week1, Assignment(Gradient Checking)
声明:所有内容来自coursera,作为个人学习笔记记录在这里. Gradient Checking Welcome to the final assignment for this week! In ...
- 【JS】正则向前查找和向后查找
正向查找:就是匹配前面或后面是什么内容的,所以分类是:正向前查找,正向后查找 负向查找:就是匹配前面或后面不是什么内容的,所以分类是:负向前查找,负向后查找 操作符 说明 描述 (?=exp) 正 ...
- Python文件读写之r+/w+/a+
读模式 r 打开不存在的文件会报错.不能写:如不指定模式则默认是r 写模式 w 打开不存在的文件会,会新建一个文件:打开存在的文件会先清空后覆盖原有文件:不能读 追加模式 a 打开不存在的文件会,会新 ...