1

我正在为学校做作业,但我得到了奇怪的输出。所以,我想我应该开始检查我的一些更基本的方法,然后再使用更高级的方法。我的问题是:方法

public static short get16(byte a, byte b){  
    return (short)(a*Math.pow(2,8)+b)
}

返回 ashort其中前 8 位是字节a,后 8 位是字节b?我不明白为什么它不会,因为乘以2^8与左移 8 位相同。并且添加第二个字节将弥补乘以 所获得的 8 个 0 2^8。它是否正确?

4

2 回答 2

2

我不建议使用Math.pow256 来计算 pow。众所周知,它很难正确实现;一些现存的实现甚至没有得到正确的确切案例!

此外,byteJava 中的 s 已签名,因此您可能想说(a&255)and(b&255)而不仅仅是aand b。标志扩展会毁了你的一切。

于 2013-04-22T07:13:10.833 回答
1

你应该知道的一些事情:

“Math.pow”是一个浮点函数。不要通过调用浮点函数然后对结果进行舍入来进行整数计算。

Java 虚拟机内部是一个 32 位系统。所有“字节”和“短”数学表达式在内部被评估为“int”。即使添加两个字节在内部也是这样的:1)将字节转换为整数,2)添加整数,3)将低 8 位转换为字节。

正确的方法是:

return (short) ((a << 8) + (b & 255));

或者

return (short) ((a << 8) | (b & 255));

当“byte”转换为“int”时,符号位被复制到新位中。比如0b01010101变成0b00000000_00000000_00000000_01010101,因为第一位是0,但是0b10101010变成0b11111111_11111111_11111111_10101010。

于 2013-04-22T07:34:56.967 回答