101 は 3 ビット長であると想定しています。Java は可変長ビット操作をサポートしていません。それint
はビット全体で動作するため~
、not
32 ビット長の「101」になります。
---「どうしたら直せますか?」と聞かれて編集。---
とても良い質問ですが、答えは「できない」と「同じことを別の手段で達成できる」の組み合わせです。
~
オペレーターが行うことを行うため、オペレーターを修正することはできません。+
1 の位だけを追加するように修正を求めるようなものです。起こらないだけです。
目的の操作を実現できますが、それを実行するにはもう少し「もの」が必要です。最初に、対象のビットを指定する何か(別の int)が必要です。これは通常、ビット マスクと呼ばれます。
int mask = 0x00000007; // just the last 3 bits.
int masked_inverse = (~value) & mask;
私たちが行ったことは、実際には 32 ビットを反転し、それらのビットのうち 29 ビットをゼロにしたことに注意してください。なぜなら、それらはマスクでゼロに設定されているためです。これは、「それらを気にしない」ことを意味します。&
これは、「設定されていて、それを気にかけている場合は、設定してください」と言うように演算子を活用していると想像することもできます。
これで 32 ビットのままですが、下位 3 のみが反転されます。3 ビットのデータ構造が必要な場合は、話は別です。Java (およびほとんどの言語) は、そのようなことを直接サポートしていません。そのため、それをサポートするために Java に別の型を追加したくなるかもしれません。Java はクラスメカニズムを介して型を追加しますが、組み込みの型は変更できません。これは、3 ビットのデータ構造を表すクラスを作成できることを意味しますが、int を内部で 32 ビット フィールドとして処理する必要があります。
幸いなことに、誰かがすでにこれを行っています。これは標準 Java ライブラリの一部であり、BitSet
.
BitSet threeBits = new BitSet(3);
threeBits.set(2); // set bit index 2
threeBits.set(0); // set bit index 0
threeBits.flip(0,3);
ただし、このようなビット操作は、Java で新しい型を追加する唯一の方法としてクラスを定義することから派生する、Java のクラス/オブジェクト システムの制約により、異なる感覚を持ちます。