字节数组到十进制Java

时间:2013-10-19 11:53:45

标签: java

我有一个具有以下代码的个人类

public class Individual {

    static int DNA_lenght = 64;
    private int fitness = 0;

    private byte[] genes = new byte[DNA_lenght];

    public void initialise_individual(){

        for(int i = 0; i < DNA_lenght; i++){

            byte gene = (byte) Math.round(Math.random());
            genes[i] = gene;
        }

    }
}

如何编写一个方法将个体的整个值转换为十进制值?

3 个答案:

答案 0 :(得分:2)

您似乎想要创建一个随机的字节数组。但是你目前正在做的是生成一个0和1字节(而不是位)的随机数组。所有字节(= 8位)都是00000000或00000001.您真正想要的是0-255范围内的字节。您应该使用Random.nextBytes(byte[] genes)来创建基因。

  

生成随机字节并将它们放入用户提供的字节数组中。产生的随机字节数等于字节数组的长度。)

然后你想将它转换回小数。但是,只要有超过4个字节,这些值就不再适合32位(= 4字节)整数。如果你有超过8个字节,它们将不适合64位整数等。

对于转换,我会使用BigInteger类。它会为您完成转换,因此您无需处理endianness

因此,假设您需要一个64 的随机基因,请按以下步骤操作:

public static void main( String args[] ){
      // create random object
      Random r = new Random();

      int numBits = 64;
      int numBytes = numBits/8;

      // create the byte array
      byte[] genes = new byte[numBytes];

      //fill it
      r.nextBytes(genes);

      //print it
      System.out.println("byte array: " + genes);

      //now convert it to a 64-bit long using BigInteger          
      long l = new BigInteger(bytes).longValue();

      //print it
      System.out.println("long: " + l);
  }      

当然,您也可以使用以下方法直接生成随机长值:

Random r = new Random();
long longGenes = r.nextLong();

如果你确实需要一个字节数组,请将其转换为字节数组:

byte[] genes = new BigInteger(longGenes).toByteArray();

答案 1 :(得分:1)

首先,为什么length拼写为lenght

其次,这将用零填充数组,我认为这不是你想要的。

    for(int i = 0; i < DNA_lenght; i++){

        byte gene = (byte) Math.round(Math.random());
        genes[i] = gene;
    }

而是尝试类似:

    genes = new byte[64];
    new Random().nextBytes(genes);

最后,您无法将长度为64(因此为512位)的字节数组唯一地转换为十进制值(double仅为64位)。

<强>更新

在阅读了问题的评论之后,我认为您希望将64 转换为十进制值。这是可能的,可以使用new Random().nextLong()完成,或者如果您坚持使用字节数据类型:

genes = new byte[8];
// fill with random values
new Random().nextBytes(genes);
// convert to long
long decimalValue;
for (int i = 0; i < 8; i++) {
    decimalValue <<= 8;
    decimalValue += genes[i] & 0xff;
}

答案 2 :(得分:0)

我认为BigInteger更合适。有一个随机生成,例如构造函数java.math.BigInteger.BigInteger(int numBits, Random rnd)。还有来自字节数组和toByteArray方法的构造函数。