随机字节转换为int java

时间:2018-11-09 02:32:11

标签: java random byte bitwise-operators twos-complement

  1. 在Random类中,定义一个nextByte方法,该方法返回原始类型的值 字节。一系列调用中返回的值应均匀地分布在所有 类型中可能的值。
  2. 在Random类中,定义一个返回原始类型值的nextInt方法 诠释一系列调用中返回的值应均匀分布在所有可能的位置上 类型中的值。 (提示:Java要求实现对整数使用二进制补码表示。 弄清楚如何从四个随机字节中计算一个随机的二进制补码表示形式 值使用Java的移位运算符。)

嗨,我能够做第3部分,现在我需要使用3.来解决4.,但是我不知道该怎么做。我正在考虑使用nextByte组成一个4个字节的数组,然后将每个字节取二进制补码,这样我就不会有负数,然后将它们放到一个int中。 byte [] bytes = {42,-15,-7,8}假设nextByte返回此字节。 然后,我将每个数字的二进制补码视为{42,241,249,8}。这是它的样子吗,为什么此代码不起作用:

public static int twosComplement(int input_value, int num_bits){
    int mask = (int) Math.pow(2, (num_bits - 1));
    return -(input_value & mask) + (input_value & ~mask);
  }

然后,我将使用以下内容将所有四个字节放入一个int,这样可以正常工作:

int i= (bytes[0]<<24)&0xff000000|
       (bytes[1]<<16)&0x00ff0000|
       (bytes[2]<< 8)&0x0000ff00|
       (bytes[3]<< 0)&0x000000ff;

请尽可能具体。

1 个答案:

答案 0 :(得分:1)

该作业表明Java 已经已使用二进制补码整数。这是一个有用的属性,可简化其余代码:它保证了如果将32个随机位组合在一起(或者通常,无论您想要的输出类型具有多少位),那么这将覆盖所有可能的值一次并且没有无效值模式。

某些其他整数表示可能不正确,其他整数表示可能仅具有2³²-1的不同值(留下必须避免的无效模式)或具有2³²的有效模式,但同时具有“正”和“负”两个值“零”,这将导致随机位模式具有偏差的“解释值”(零出现的频率应为应有的两倍)。

因此,它不是您要做的事情,它是一种方便的属性,可用于使代码保持简单。实际上,您已经使用过它。这段代码:

int i= (bytes[0]<<24)&0xff000000|
       (bytes[1]<<16)&0x00ff0000|
       (bytes[2]<< 8)&0x0000ff00|
       (bytes[3]<< 0)&0x000000ff;

由于这些属性,可以正常工作。顺便说一下,它可以简化一点:左移24之后,符号扩展不再存在问题,所有扩展位都已移出。左移0很明显是无操作。因此(bytes[0]<<24)&0xff000000可以写成(bytes[0]<<24),而(bytes[3]<< 0)&0x000000ff可以写成bytes[3]&0xff。但是您可以通过良好的常规结构来保持原样。 不需要twosComplement函数。