1

バイトに基づいてJava配列にインデックスを付けることは可能ですか?

つまり、次のようなもの

array[byte b] = x;

ファイルから b (上記のコード) を読み取る非常にパフォーマンスが重要なアプリケーションがあり、これを int に変換するオーバーヘッドは必要ありません。これを達成するための最良の方法は何ですか?int ではなくこのインデックス方法を使用した結果、パフォーマンスが低下しますか?

多くの感謝とともに、

フロスコイ。

4

4 に答える 4

6

「これをintに変換する」ためのオーバーヘッドはありません。Javaバイトコードレベルでは、すべてbyteのsはすでにintsです。

intいずれにせよ、配列のインデックス作成を行うと、とにかく自動的にアップキャストされます。これらのいずれもパフォーマンスを向上させることはなく、多くはパフォーマンスを低下させます。を使用してコードを残すだけintです。

JVM仕様、セクション2.11.1

表2.2のほとんどの命令には、整数型byte、char、およびshortの形式がないことに注意してください。ブール型のフォームはありません。コンパイラは、コンパイル時または実行時にこれらの値をint型の値に符号拡張するJava仮想マシン命令を使用して、byte型およびshort型のリテラル値のロードをエンコードします。boolean型とchar型のリテラル値のロードは、コンパイル時または実行時にリテラルをint型の値にゼロ拡張する命令を使用してエンコードされます。同様に、boolean、byte、short、およびchar型の値の配列からのロードは、値をint型の値に符号拡張またはゼロ拡張するJava仮想マシン命令を使用してエンコードされます。したがって、実際の型boolean、byte、char、およびshortの値に対するほとんどの操作は、計算型intの値を操作する命令によって正しく実行されます。

于 2012-09-27T21:48:59.057 に答える
3

Javaのすべての整数型は署名されているため、0x7Fより大きいファイル値から読み取ることが期待される場合は、bの値の8ビットをマスクする必要があります。

byte b;
byte a[256];
a [b & 0xFF] = x;
于 2012-09-27T21:48:50.860 に答える
0

いいえ; 配列インデックスは非負の整数(JLS 10.4)ですが、バイトインデックスがプロモートされます。

于 2012-09-27T21:48:37.607 に答える
0

いいえ、パフォーマンスの低下はありません。バイトを読み取った瞬間に、CPUレジスタに格納するためです。これらのレジスタは常にWORDで機能します。つまり、バイトは常にint(64ビットマシンの場合はlong)に「変換」されます。

したがって、次のようにバイトを読み取るだけです。

int b = (in.readByte() & 0xFF);

アプリケーションがそのパフォーマンスクリティカルである場合は、他の場所で最適化する必要があります。

于 2012-09-27T21:49:32.403 に答える