随机字节到int java 在Random类中,定义一个返回基元类型值的nextByte方法 字节。在一系列调用中返回的值应均匀分布在所有 类型中可能的值 在Random类中,定义一个返回基元类型值的nextInt方法 int。在一系列调用中返回的值应均匀分布在所有可能的 类型中的值。 (提示:Java要求实现对整数使用twos补码表示。 了解如何从四个随机字节计算随机二补表示 使用Java的移位运算符的值。)

随机字节到int java 在Random类中,定义一个返回基元类型值的nextByte方法 字节。在一系列调用中返回的值应均匀分布在所有 类型中可能的值 在Random类中,定义一个返回基元类型值的nextInt方法 int。在一系列调用中返回的值应均匀分布在所有可能的 类型中的值。 (提示:Java要求实现对整数使用twos补码表示。 了解如何从四个随机字节计算随机二补表示 使用Java的移位运算符的值。),java,random,byte,bitwise-operators,twos-complement,Java,Random,Byte,Bitwise Operators,Twos Complement,嗨,我能做第三部分,现在我需要用第三部分。解决4。但我不知道该怎么办。我想用nextByte来做一个4字节的数组,然后我会取每个字节的两个补码,这样我就不会有负数,然后我会把它们放在一个int中。 byte[]bytes={42,-15,-7,8}假设nextByte返回这个字节。 然后我会取两个,我认为是{42,241,249,8}。这就是它的样子吗?为什么这段代码不起作用: public static int twosComplement(int input_value, int num_b

嗨,我能做第三部分,现在我需要用第三部分。解决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;

int i=(bytes[0]赋值表示Java已经使用了2的补码整数。这是一个有用的属性,可以简化代码的其余部分:它保证如果将32个随机位(或者通常是所需输出类型的任意位)组合在一起,则只覆盖一次所有可能的值,并且不存在无效模式

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

因此,它不是您要做的事情,而是一个方便的属性,您可以使用它来保持代码的简单。实际上,您已经使用了它。此代码:

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

int i=(bytes[0]只需取四个随机字节,并将它们像在上一条语句中那样组合起来。去掉TwosCompletion方法,它只是一个复杂的NO-OP。