1

学校の課題に取り組んでいるのですが、奇妙な出力が得られます。そのため、手の込んだ方法に進む前に、より基本的な方法のいくつかを確認する必要があると考えました。私が持っている質問はこれです:方法は

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

short最初の 8 ビットがバイトaで、最後の 8 ビットがバイトであるa を返しますbか? 2^8乗算は左に 8 ビットをシフトすることと同じであるため、なぜそうならないのかわかりません。そして、2 番目のバイトを追加すると、 を掛けることによって達成される 8 つの 0 を補うことができ2^8ます。これは正しいです?

4

2 に答える 2

2

Math.powを使用して 256 を計算する ことはお勧めしませpowん。正しく実装するのが難しいことで有名です。一部の現存する実装では、正確なケースを正しく取得することすらできません!

また、 Java の s は署名されているため、単にandではなくandbyteと言いたいと思うでしょう。サイン延長はあなたのためにすべてを台無しにします。(a&255)(b&255)ab

于 2013-04-22T07:13:10.833 に答える
1

あなたが知っておくべきいくつかのこと:

「Math.pow」は浮動小数点関数です。浮動小数点関数を呼び出して結果を丸めることで整数計算を行わないでください。

Java 仮想マシンは、内部的には 32 ビット システムです。すべての「byte」および「short」数式は、内部的に「int」として評価されます。2 バイトの追加でも、内部的には次のようになります。1) バイトを int に変換し、2) int を追加し、3) 下位 8 ビットを byte に変換します。

正しい方法は次のとおりです。

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 に答える