如何在Java中将负浮点数转换为二进制向量?

时间:2017-11-11 12:48:03

标签: java floating-point

如何将-2.25之类的浮点数转换为二进制?我需要为从-20.5到20.5的域创建遗传算法的群体。每条染色体应仅用0s和1s重新印迹

1 = 01
0 = 00
4 = 100

等等

我知道如何转换“2”而不是0.25,也不知道带负号的数字

这是我的方法而且我被困在那里。转换浮点数,负数int或负浮点数

时,我无法知道如何增强它以给我正确的结果
public class MinimizeRastriginFunction {

    public static String binary="";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        //float x=(float) 2.5;
        int x =5 ;
        System.out.println("Before :" + x);
        decToBin(x);
        System.out.println("After :"  + binary);


    }

    private static Object decToBin(int dec) {
        // TODO Auto-generated method stub
        int num;

        if (dec <=1) {
            binary +=dec;
            return null;   // KICK OUT OF THE RECURSION
        }

        num= dec %2; 
        decToBin(dec >>1);
        binary += num;
        return null;    
    }

2 个答案:

答案 0 :(得分:0)

<强>更新 根据你的评论,只保留20个字符,然后解决方案将如下所示:

import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(convert("0.25"));
        System.out.println(convert("-0.25"));
        System.out.println(convert("2"));
        System.out.println(convert("-2"));
    }
    public static String convert(String input) {
        double number = Double.parseDouble(input);
        long longBits = Double.doubleToLongBits(number);
        String result = Long.toBinaryString(longBits);

        String upToNCharacters = result.substring(0, Math.min(result.length(), 20));
        return upToNCharacters;
    }
}

输出:

11111111010000000000
10111111110100000000
10000000000000000000
11000000000000000000

为什么不尝试这种方法。有一个内置功能可以帮助你

例如:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(convert("0.25"));
        System.out.println(convert("-0.25"));

    }

    public static String convert(String input) {

        double number = Double.parseDouble(input);
        long longBits = Double.doubleToLongBits(number);
        String result = Long.toBinaryString(longBits);

        return result.replaceAll("0+$", "");;
    }

}

同时检查here

你可以用它来转换你喜欢的所有dec,fload,负dec / float(s)

System.out.println(convert("0.25"));
System.out.println(convert("-0.25"));
System.out.println(convert("2"));
System.out.println(convert("-2"));

输出将是:

11111111010000000000000000000000000000000000000000000000000000
1011111111010000000000000000000000000000000000000000000000000000
100000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000

并在输出中使用某种格式(使用正则表达式删除所有尾随的0):

return result.replaceAll("0+$", "");

输出将是您想要的输出

1111111101
101111111101
1
11

最后,如果你需要返回一个Int(向量)数组,或者其他什么,你可以通过类似提到here之类的东西逐个处理它们。 mmoore在一个简单的循环中为转换提供了一个出色的答案:)

答案 1 :(得分:0)

我想你不需要为你的数字提供无限分辨率,例如: 2.4999不需要获得与2.5000不同的位模式。

使用分辨率,例如0.01您可以执行:int bitsNumber = (int) ((value + 20.5) / 0.01);然后将int转换为二进制字符串,就像您已经完成它一样(或使用Integer.toBinaryString(bitsNumber))。