質問

どのように私はJavaでunsigned short値を宣言することができますか?

役に立ちましたか?

解決

あなたは、本当にすることはできません。 Javaはcharを除き、任意の符号なしのデータ型を持っていません。

確かに、あなたは<全角> のcharを使用することができます - それは、16ビットの符号なしタイプだ - しかし、charが明確にテキストのためにあることを意味するとして、それは、私の見解では恐ろしいことになります。コードはcharを使用する場合、私は期待してそれはプログラム、テキストとは無関係ではない任意の符号なしの16ビット整数に興味深いテキストを表すUTF-16コード単位のためにそれを使用することにする。

他のヒント

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

解決方法1:を使用すると、比較(<、<=、>、> =)、または除算(/、%、>を行う必要がある場合を除き、短い署名し、印を心配停止可能なを使用します>)操作。 をhref="https://stackoverflow.com/questions/397867/port-of-random-generator-from-c-to-java#397997">参照してください。彼らは、符号なしあたかもます。

(溶液1が適用されない)の解決策2:のINTの下位16ビットを使用して、必要と&0xFFFFの上位ビットを削除

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

私たちは、A-Dのから符号なしの16の多くを扱うので、カスタム組み込みハードウェアによって記録された信号を処理します。私たちは、年間のすべての場所で文字を使用していると、すべての問題を抱えていたことがありません。

それは符号なしの16ビット値であるとして、(技術的にそれはそうpotnetially将来的に24ビットの値になるように変更される可能性のUnicode文字ですが)

あなたは、文字を使用することができます...他の代替は、int型を使用することですそして、それは範囲内にあることを確認します。

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

そして、ここでは、Javaと符号なしの不足を議論リンクです。

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);
}

Javaではありません、このようなタイプ

うんあなたはビット演算対コードの値を使用したい場合はそのような事ます。

いや、本当にそのような方法はありませんが、Javaは、高レベルの言語です。 Javaは任意の符号なしのデータ型を持っていない理由です。

彼は、多次元の短い配列を作成したいと述べました。まだ1ビット単位の演算子を示唆していませんか?私が読んだものからは、メモリを節約するために32ビット整数上で16ビット整数を使用するようにしたいですか?

そこでまず、10,000×万短い値を開始する16億ビット、200,000,000バイト200,000キロバイト200メガバイトである。

あなたは、メモリの消費量の200メガバイトで何かが必要な場合は、

あなたはこの考えを再設計することをお勧めします。私はまたしても一人で実行させてコンパイルすることを信じていません。何が需要の読み込みとデータキャッシングで呼ばれる2つの機能を利用する場合はそのような大規模な配列を初期化することはありません。それが必要とされているのと本質的に需要負荷にのみ負荷データにアイデアを指します。そして、データキャッシュは同じことを行いますが、削除古い記憶し、必要に応じて新たな情報を追加するためのカスタムフレームワークを利用しています。この1はGOOD速度性能を持ってするのが難しいです。そこを行うことができます他のものがありますが、右完了したら、これらの二つは私のお気に入りです。

バック私はビット演算子について言ったものによします。

だから、32ビット整数またはJavaで「INT」。あなたはそうあなたがすべての値がintのために(長い除く)32ビットを取るか、彼らはバイトのために8を取る配列のため、短いため16、および32 Javaで32のブール値を持っていたとしましょうこれに「ビット」と呼ばれているものを保存することができます。あなたは配列を持っていない限り、あなたはバイトまたは短いを使用してから任意のメモリの利点を得ることはありません。これは、あなたや他の人は、この値が持つべきデータの範囲を知っていることを確認するために、その方法としてそれを使用してはならないという意味ではありません。

今、私はあなたが効果的に次の操作を実行して、単一の整数に32個のブール値を格納することができ言っていた通ります:

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;

それでは短いは、16ビット、32ビット整数の中に完全に適合しそう16 + 16 = 32で構成されています。だから、すべてのint型の値が2つのshort値で構成することができます。

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

したがって、上記のものをやっていることは価値ある-32768間と32767または符号なしの値0として何かある - それでは、値が等しく言わせ-1ので、符号なしの値としては、これは16を介してビット1を意味します65535だった65535オンになって、実際に数学を実行するときの範囲を検討されている0 - 15

だから我々は、15ビットよりも大きな何かを始めなければなりません32 -

だから我々は、ビット17を有効にする必要があります。だから我々は、16ビットで始まります。だから、値2を取り、「<< 16」は何である65536を乗じて。私たちは、今のは、値2は、そのように私たちの整数値が262143に等しくなる= 196608. 3x65536をOR演算されるだろう。

3に等しかったとしましょうだろう
int assumed_value = 262143;

それでは、我々は2つの16ビット整数値を取得したいとしましょう。

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

はまた、基本的に、彼らが実際にあるすべてである2のべき乗として、ビット演算子を考えます。 0と1のそれ観点で見ないでください。私はほとんどのunsigned shortあるいはおそらく多次元配列のために、この検索に遭遇する可能性があり、誰を支援するために、これを投稿しました。いずれかのタイプミスのがある場合は、私はすぐにこれを書いています。

謝罪します
サードパーティのライブラリを使用すると、オプションである場合は、

女王する(スピンオフライブラリがあります jOOQ の)、ジャワの符号なし整数のラッパーの種類を提供しています。これは、符号なし型のサポートプリミティブ型(したがって、バイトコード)を有するとまったく同じものではありませんが、おそらくそれはまだあなたのユースケースには十分だ。

import static org.joou.Unsigned.*;

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

(免責事項:私はこれらのライブラリの背後にある会社のために働く)

Javaは符号なしの型を持っていません。あなたは何のためにそれが必要なのですか?

Javaはしかし、 'バイト' データ型を持っています。

あなたはShortUnsignedクラスを自分自身をコーディングして、必要なものを事業者のためのメソッドを定義することができます。あなたは、残念ながら、それらに+-などに過負荷をかけず、また他のプリミティブまたは数値オブジェクト型との暗黙の型変換を持つことができなくなります。

あなたは他のデータ型が記入しないことを、符号なしの短いため、この差し迫った必要性を持っている理由

他の回答者の一部のように、私は疑問に思います。

符号なしの数字が必要な理由を示すために、

簡単なプログラムます:

package shifttest;
public class ShiftTest{
    public static void main(String[] args){
        short test = -15000;
        System.out.format ("0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n",
            test, test>>1, test>>2, test>>3, test>>4);
    }
}

結果:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56

これでシステムタイプでないもののために:

JAVAオペランドが署名されているので、しかし、論理シフトが適切であろうが、JAVA(特に太陽)は、それらの短い近視に私たちのために、それは不要あまりに悪いとみなさ場合がある算術シフトを行います。すべてのあなたは長い数字を締結しているしているときのシフト、AND、OR、排他的論理和は、限られたツールです。 16ビット以上ある「REAL」のコンピュータのビットを話しハードウェアデバイスとのインタフェース場合、これは特に問題です。 「CHAR」が動作することが保証されていません(それは今広い2バイトである)が、中国語、韓国語、日本語など、いくつかの東のGIFベースの言語で、少なくとも3つのバイトが必要です。私はsandscriptスタイル言語の番号が必要に精通していないです。バイト数はJAVAのための標準化委員会ではなく、プログラマには依存しません。 16ビットは、下流のリスクを持っているように、文字を基づか。安全に符号なしshortのJAVAを実装するには、のような特殊なクラスは、前述の曖昧さに基づいて最適なソリューションです。クラスの欠点は、この特別なクラスのための数学演算をオーバーロードすることができないことです。正確にこのスレッドの貢献者の多くは、これらの問題を指摘したが、私の貢献は、作業のコード例およびLinuxでのC ++での3つのバイトのGIFを言語と私の経験です。

//вот метод для получения аналога unsigned short
    public static int getShortU(byte [] arr, int i )  throws Exception 
    {
       try
       {
           byte [] b = new byte[2]; 
           b[1] = arr[i];
           b[0] = arr[i+1];
           int k = ByteBuffer.wrap(b).getShort();
            //if this: 
           //int k = ((int)b[0] << 8) + ((int)b[1] << 0); 
           //65536 = 2**16
           if ( k <0) k = 65536+ k; 
        return k;
      }  
       catch(Throwable t)
      {
          throw  new Exception ("from getShort: i=" + i);
      }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top