嗨,我能够做第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;
请尽可能具体。
答案 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
函数。