2

私はマスクを作成し、次のようなショートでより高いビットを設定しています:

  enum FLAGS {FLAG1, FLAG2, FLAG3, FLAG4, FLAG5, FLAG6};

  public static void setFlag(short len, FLAGS flag) {
       short mask = 1 << (Short.SIZE - flag.ordinal() - 1);
       len |= mask;
  }

私は値を印刷しました:

  len: 0000001111111100
  mask : 1000000000000000
  after OR'ing with mask: 11111111111111111000001111111100

short でビット操作を行うと、オーバーフローを避けるために int にアップグレードされることは理解していますが、なぜすべての上位ビットが設定されるのでしょうか? 変なキャストなしで最初の 6 ビットのいずれかを設定するにはどうすればよいですか?

4

4 に答える 4

0

AND ではなく OR を使用しているようです。'|' は or、'&' は and です。また、short と short ではなく、short と int を OR しています。あなたのprintステートメントはOR'ingとさえ言っていますが、タイトルはAND'ingと言っています。「&=」を使用すると、問題が解決すると思います。

于 2013-09-30T18:33:17.477 に答える
0

shortが に変換されるときint、その数値は保持されます。最上位ビットが 1 の場合、shortは負の数であり、その値を維持するには、 をint負にする必要があります。つまり、 の最上位ビットintも 1 にする必要があり、その間のすべてのビットも 1 にする必要があります。

short一般に、 aをに変換する場合int、負の数値は左側に 1 を埋め込み、正の数値は左側に 0 を埋め込みます。

于 2013-09-30T18:49:40.097 に答える
0

結果をショートにキャストするだけです。ビットが符号ビットであるマスクに設定されているintため、結果に符号拡張が含まれています。0x8000

short でビット操作を行うと、オーバーフローを避けるために int にアップグレードされます。

いいえ。オーバーフローはあり得ないので、それが理由ではありません。その理由は、+、-、*、/ など、オーバーフローする可能性のある他の操作との一貫性のためです。

于 2013-10-01T02:01:57.430 に答える