4

これは本当に基本的な質問ですが、「違いはない」という私の直感的な答えが正しいと完全に確信したことはありません。したがって、誰かがこれを理解する良い方法を持っているかもしれません。

Javaのプリミティブ数値タイプの1つでやりたいのがビット単位の演算だけの場合、それを符号なしの値であるかのように単純に扱うことができますか、それとも負の数を避ける必要がありますか。つまり、最上位ビットを常に0に設定します。 ?たとえば、intを符号なし32ビットの数値であるかのように使用できますか、それとも下位31ビットのみを使用する必要がありますか?

できるだけ一般的な答えを探していますが、例を挙げましょう。32個のフラグを格納したいとします。次のようなものを使用する場合、それらすべてを1つのintに格納できますか?

store = store & ~(1 << index) | (value << index)

フラグを設定indexするにvalue

return (store & (1 << index)) != 0

フラグを取得するにはindexindexまたは、フラグを31対1に設定した場合、このコードまたは同様のコードで何らかの問題が発生する可能性がありますか?

右シフトには>>ではなく>>>を常に使用する必要があることはわかっていますが、これが唯一の懸念事項ですか?または、最上位ビットを使用するときに、負の数の2の補数表現に関連して他の問題が発生する可能性がありますか?

4

2 に答える 2

3

右シフトには>>ではなく>>>を常に使用する必要があることはわかっていますが、これが唯一の懸念事項ですか?

はい、これが唯一の懸念事項です。左にシフトすると、符号付きの数値と符号なしの数値で同じように機能します。ANDing、ORing 、ingについても同じことがXOR言えます。右シフトに使用する限り>>>、符号付きの32ビットすべてを使用できますint

于 2012-10-11T01:41:27.123 に答える
2

そのコンテキストでも使用する正当な理由があり>>ます(一般的なケースは、0または1のマスクを無効にすることなく、0または-1のマスクを直接作成する場合です)。したがって、実際にはまったく問題はありません。 。それがあなたの意図と一致することを確認するためにあなたがしていることに注意してください。

符号を気にする操作(つまり、異なるセマンティクスを持つ別個の符号付きフォームと符号なしフォームがあります)は次のとおりです。

  • 右シフト
  • 分割(署名されていないフォームはJavaでは使用できません)
  • モジュロ(符号なし形式はJavaでは使用できません)
  • 比較(同等性を除く)(署名されていないフォームはJavaでは使用できません)

署名を気にしない操作は次のとおりです。

  • また
  • xor
  • 添加
  • 減算
  • 2の補数の否定(-x意味~x + 1
  • 1の補数(~x意味-x - 1
  • 左方移動
  • 乗算
于 2012-10-11T10:30:08.370 に答える