unsigned short
Javaで値を宣言するにはどうすればよいですか?
16 に答える
本当にできません。Javaには、を除いて符号なしデータ型はありませんchar
。
確かに使用できますchar
-これは16ビットの符号なしタイプです-しかし、それchar
は明らかにテキスト用であることを意味しているので、私の見解では恐ろしいでしょう:コードが使用するとき、テキストをchar
表すUTF-16コードユニットに使用することを期待していますこれはプログラムにとって興味深いものであり、テキストとは関係のない任意の符号なし16ビット整数ではありません。
正確に16ビットの値が本当に必要な場合:
解決策1:比較(<、<=、>、> =)または除算(/、%、>>)操作を行う必要がない限り、使用可能な符号付きショートを使用し、符号について心配するのをやめます。符号付き数値を符号なしのように処理する方法については、この回答を参照してください。
解決策2(解決策1が適用されない場合): intの下位16ビットを使用し、必要に応じて&0xffffで上位ビットを削除します。
これは本当に古いスレッドですが、後から来る人のために。charは数値型です。すべての数学演算子、ビット演算などをサポートします。符号なし16です。
カスタム組み込みハードウェアによって記録された信号を処理するため、ADからの署名されていない16の多くを処理します。私たちは何年もの間、至る所でチャーを使用しており、問題はありませんでした。
符号なし16ビット値であるためcharを使用できます(技術的にはUnicode文字であるため、将来的に24ビット値に変更される可能性があります)...他の方法は、intを使用して確認することです。範囲内です。
charを使用しないでください-intを使用してください:-)
そして、ここにJavaとunsignedの欠如について議論しているリンクがあります。
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にはそのようなタイプはありません
型unsignedshortを宣言することはできませんが、私の場合、forループで使用するためにunsigned番号を取得する必要がありました。「符号なし変換によってintに変換された引数」を返すtoUnsignedInt
クラスのメソッドがあります。Short
short signedValue = -4767;
System.out.println(signedValue ); // prints -4767
int unsignedValue = Short.toUnsignedInt(signedValue);
System.out.println(unsingedValue); // prints 60769
IntegerとLongにも同様のメソッドがあります。
Integer.toUnsignedLong
Long.toUnsignedString
:この場合String
、より大きな数値タイプがないため、最終的にはになります。
コード対ビット演算で値を使用したい場合は、そのようなことはありません。
「JavaSE8以降では、intデータ型を使用して、最小値が0、最大値が232-1の符号なし32ビット整数を表すことができます。」ただし、これはintとlongにのみ適用され、shortには適用されません:(
いいえ、実際にはそのようなメソッドはありません。Javaは高級言語です。そのため、Javaには符号なしデータ型がありません。
彼は、多次元の短い配列を作成したいと述べました。しかし、ビット単位の演算子を提案した人は誰もいませんか?私が読んだことから、メモリを節約するために32ビット整数よりも16ビット整数を使用したいですか?
したがって、最初に10,000 x 10,000の短い値を開始するには、1,600,000,000ビット、200,000,000バイト、200,000キロバイト、200メガバイトです。
200MBのメモリを消費するものが必要な場合は、このアイデアを再設計することをお勧めします。私はまた、それが実行はもちろんのこと、コンパイルさえするだろうとは信じていません。オンデマンドロードとデータキャッシングと呼ばれる2つの機能を利用する場合は、このような大きなアレイを初期化しないでください。基本的にオンデマンドロードとは、必要なときにのみデータをロードするという考え方を指します。次に、データキャッシングは同じことを行いますが、カスタムフレーム作業を利用して、古いメモリを削除し、必要に応じて新しい情報を追加します。これは、優れた速度性能を得るのに注意が必要です。他にもできることはありますが、正しく実行すれば、これら2つが私のお気に入りです。
さて、ビット演算子について私が言っていたことに戻りましょう。
つまり、32ビット整数またはJavaの「int」です。これに「ビット」と呼ばれるものを格納できるので、Javaではすべての値が32ビット(longを除く)を占める32個のブール値があるか、配列の場合はバイトが8、shortが16、intが32であるとします。 。したがって、配列がない限り、バイトまたはショートを使用してもメモリのメリットは得られません。これは、この値が持つべきデータ範囲を自分や他の人に確実に知らせる方法として使用すべきではないという意味ではありません。
さて、私が言っていたように、次のようにすることで、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に等しいとすると、ORは3x65536 = 196608になります。したがって、整数値は262143になります。
int assumed_value = 262143;
したがって、2つの16ビット整数値を取得するとします。
short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3
また、基本的にビット演算子は2の累乗と考えてください。それが実際のすべてです。0と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(特にSun)は不要と判断し、近視眼的には残念です。Shift、And、Or、およびExclusive Orは、すべてがより長い番号に署名されている場合の限定されたツールです。これは、16ビット以上の「実際の」コンピュータビットを話すハードウェアデバイスに接続する場合に特に問題になります。「char」の動作は保証されていませんが(現在は2バイト幅です)、中国語、韓国語、日本語などの東部のgifベースの言語では、少なくとも3バイトが必要です。私はサンドスクリプトスタイルの言語の数の必要性に精通していません。バイト数は、JAVAの標準化委員会ではなく、プログラマーに依存しません。したがって、charを16ビットとしてベースにすると、ダウンストリームのリスクがあります。特別なクラスが前述のあいまいさに基づく最良の解決策であるため、署名されていないショーツ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);
}
}