【问题标题】:random byte to int java随机字节到 int java
【发布时间】:2018-11-09 02:32:10
【问题描述】:
  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;

请尽可能具体。

【问题讨论】:

  • 只需将四个随机字节组合起来,就像在上一条语句中一样。摆脱twosComplement方法,它只是一个复杂的NO-OP。

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


【解决方案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]&lt;&lt;24)&amp;0xff000000可以写成(bytes[0]&lt;&lt;24)(bytes[3]&lt;&lt; 0)&amp;0x000000ff可以写成bytes[3]&amp;0xff。但是你可以保持原样,具有良好的规则结构。 twosComplement 函数不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2013-05-12
    • 2015-01-12
    • 1970-01-01
    • 2016-11-04
    • 2014-04-04
    • 2011-01-20
    相关资源
    最近更新 更多