1

関連する質問: Java short と short の AND を実行すると、int にアップグレードされ、奇妙な値が返されます

各ビットに 1 つずつ、16 個のフラグを設定するために使用する必要がある短い (2 バイト) スペースがあります。n 番目のビット (n = 0, 1..15) を設定/チェック/クリアする API を作成する必要があります。MSBit の場合に問題が発生します。

私は次のように設定しています:

 short setBit(short flags, int n) {
     flags |= (1 << n);
     return flags;
 }      

n の場合15、符号ビットを設定すると、結果の値は : になります1111111111111111111111111111111111111111111111111000000000000000

実行して、これから下位16ビットをフェッチしようとしました:

            flags &= 0xffff;

符号ビットが同じままであるため、期待されるのと同じ答えが得られます。最上位ビットを設定して、型を変換したり、符号ビットを拡張したり、残りのスペースを埋めたりしないようにするにはどうすればよいですか? (これらのフラグはディスクに書き込まれます)。

4

2 に答える 2

1

あなたの問題は、Java の暗黙の型昇格システムに起因します。

Java の「役立つ」型のプロモーションに対抗するには、賢明な型キャストが必要です...

short setBit(short flags, int n) {
  return (short)( flags | (short)(1 << n));
}

また、次のように印刷するときに型の昇格を避けることができます: (prints in hex)

System.out.printf("%x\n",setBit(myShortVariable,15));
于 2013-10-13T19:15:36.443 に答える
0

charの代わりに a を使用しshortます。
参照: Java の unsigned short

 char setBit(char flags, int n) {
     if (n <= 15) {
       char bit = (1 << n); 
       flags |= bit;
     }
     return flags;
 }  
于 2013-10-05T19:17:15.963 に答える