web-dev-qa-db-ja.com

Javaの符号なしショート

Javaでunsigned short値を宣言するにはどうすればよいですか?

55
maiky

本当にできません。 Javaには、charを除き、符号なしデータ型はありません。

確かにあなたはcouldcharを使用します-それは16ビットの符号なし型です-しかし、charは明らかにテキスト用であることを考えると、これは恐ろしいことです:コードがcharを使用する場合、プログラムと関係のない任意の符号なし16ビット整数ではなく、プログラムにとって興味深いテキストを表すUTF-16コード単位に使用することを期待しています。

66
Jon Skeet

正確に16ビットの値が本当に必要な場合:

解決策1:比較(<、<=、>、> =)または除算(/、% 、>>)操作。符号付きの数値を符号なしのように処理する方法については、 この回答 を参照してください。

ソリューション2(ソリューション1は適用されない場合):intの下位16ビットを使用し、必要に応じて&0xffffで上位ビットを削除します。

14
starblue

これは本当に古いスレッドですが、後から来る人のためになっています。 charは数値型です。すべての数学演算子、ビット演算などをサポートします。符号なし16です。

カスタム組み込みハードウェアで記録された信号を処理するため、A-Dからの多くの符号なし16を処理します。私たちは何年もの間、あちこちでイワナを使用してきましたが、問題はありませんでした。

12
joel garringer

符号なし16ビット値であるため、charを使用できます(技術的にはUnicode文字なので、将来的に24ビット値に変更される可能性があります)...他の代替方法は、intを使用して範囲内です。

文字を使用しないでください-intを使用してください:-)

そしてここに リンクJavaと符号なしの欠如 を議論するリンクがあります。

10
TofuBeer

DataInputStream.Javaから

public final int readUnsignedShort() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (ch1 << 8) + (ch2 << 0);
}
4
mobiusinversion

Javaにはそのようなタイプはありません

3
paweloque

コード操作とビット操作で値を使用する場合、そのようなことはありません。

1
Jé Queue
1
RoboLam

いいえ、実際にはそのようなメソッドはありません。Javaは高レベル言語です。だから、Javaには符号なしのデータ型はありません。

1
muhammad Ahmad

彼は、多次元の短い配列を作りたいと言った。しかし、ビット演算子を提案する人はいませんでしたか?私が読んだことから、メモリを節約するために32ビット整数よりも16ビット整数を使用したいですか?

したがって、最初に10,000 x 10,000の短い値を開始するには、1,600,000,000ビット、200,000,000バイト、200,000キロバイト、200メガバイトです。

200MBのメモリ消費量が必要な場合は、このアイデアを再設計することをお勧めします。また、実行はもちろんコンパイルされるとは考えていません。オンデマンドロードとデータキャッシングと呼ばれる2つの機能を利用する場合は、そのような大きな配列を初期化しないでください。基本的にオンデマンドの読み込みとは、必要なときにのみデータを読み込むという考え方です。その後、データキャッシングは同じことを行いますが、古いメモリを削除し、必要に応じて新しい情報を追加するためにカスタムフレーム作業を利用します。これは、良好な速度パフォーマンスを得るために注意が必要です。他にもできることはいくつかありますが、これらの2つが適切に行われたときの私のお気に入りです。

さて、ビット演算子について私が言っていたことに戻りましょう。

したがって、32ビット整数またはin Java "int"。これに「ビット」と呼ばれるものを保存できます。したがって、Java =すべての値は32ビット(longを除く)または配列の場合、バイトで8、shortで16、intで32を使用します。したがって、配列がない限り、byteまたはshortを使用してもメモリの利点は得られません。これは、あなたや他の人がこの値が持つべきデータ範囲を確実に知る方法として使用すべきではないという意味ではありません。

さっき言ったように、次の操作を行うことで32個のブール値を1つの整数に効果的に格納できます。

int many_booleans = -1; //All are true;
int many_booleans = 0; //All are false;
int many_booleans = 1 | 2 | 8; //Bits 1, 2, and 4 are true the rest are false;

したがって、shortは16ビットで構成されるため、16 + 16 = 32となり、32ビット整数内に完全に適合します。したがって、すべてのint値は2つの短い値で構成できます。

int two_shorts = value | (value2 << 16);

したがって、上記の値は-32768〜32767の値、または符号なしの値0〜65535です。したがって、値が-1であるため、符号なしの値は65535でした。つまり、ビット1〜16がオンになります。 、しかし実際に計算を実行するときは、0〜15の範囲を考慮してください。

したがって、ビット17〜32をアクティブにする必要があります。したがって、15ビットよりも大きい値から開始する必要があります。したがって、16ビットから始めます。そのため、value2を取得し、それに65536を掛けることにより、「<< 16」が実行されます。ここで、value2が3に等しく、3x65536 = 196608のORになるとしましょう。したがって、整数値は262143になります。

int assumed_value = 262143;

したがって、2つの16ビット整数値を取得したいとしましょう。

short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3

また、基本的にはビット単位演算子を2のべき乗と考えます。これが実際のすべてです。 0と1の用語を見ないでください。私はこれを主に投稿して、符号なしの短い配列または多次元配列の検索に出くわす可能性のある人を支援しています。誤植がある場合は、すぐに謝罪しました。

0
Jeremy Trifilo

サードパーティのライブラリを使用するオプションがある場合は、 jOOjOOQ からのスピンオフライブラリ)があります。これは、Javaの符号なし整数のラッパータイプを提供します。これは、プリミティブ型(つまりバイトコード)が符号なしの型をサポートすることとまったく同じではありませんが、ユースケースにはまだ十分でしょう。

import static org.joou.Unsigned.*;

// and then...
UShort s = ushort(1);

(免責事項:私はこれらの図書館の背後にある会社で働いています)

0
Lukas Eder