左シフト演算: x の型が byte、short、または char の場合、x は int に昇格されます
2) x の型が byte、short、char、または int の場合、n は再割り当てされます (プロセスは: n の補数ビットの下位 5 を取得し、10 進数の int 値に変換します。これは、n を法とする 32 を取得するのと同じです: n=n%32);
x が long 型の場合、n は再割り当てされます (プロセスは次のとおりです: take) n の補数の下位 6 ビットを計算し、10 進数の int 値に変換することは、n を法 64 にすることと同じです: n=n%64);
(int 型は 4 バイト、つまり 32 ビットであるため、32 ビット移動します)長い間、これはモジュロ 64) です
3) x を n 桁左にシフトすると、式全体が新しい値を生成します (x の値は変更されません)。左シフト記号、列 x
// 左移: 向左移动,右边补0 for (int i = 0;i < 8 ;i++) System.out.print( (1 << i) + " ");
output
80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000
上記の一般規則は正しいですが、 int 型の場合はシフト桁数が 32 を超えない、long 型の場合は制限があります。 、シフトされる桁数は 64 を超えません。次に、次のテストを実行します:
Java コード
// 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1 // 符号位为1的右移 for (int i = 0;i < 8 ;i++) System.out.print( Integer.toHexString(0x40000000 >> i) + " ");
0x80000000。31 ビットを右にシフトした後、各ビットは 1 (つまり -1) になります。この考え方によれば、32 ビットを右にシフトしても -1 のままです。 、しかし、正しい 32 ビットをシフトした後の結果は数値そのものです。
int 型およびlong 型データの左シフトと右シフトをテストすることで、次のことがわかりました:
Java はシフト操作 "a bf686d2c9e4643b4bc1f5b3f5e8a94c0> b" を処理し、最初に b mod 32|| を実行します。 64 演算。 a が int 型の場合、mod 32 を取得します。a が double 型の場合、mod 64 を取得し、上記の一般的なシフト演算規則を使用してシフトします。
この時点で、なぜ BitSet クラスにこのステートメント
// 符号位为1的右移 // 最高4位为1000, 右移1位,变成1100也就是c, for (int i = 0;i < 8 ;i++) System.out.print( Integer.toHexString(0x80000000 >> i) + " ");
があるのか理解できます。jdk に精通しているプログラマは、1L << (bitIndex % 64) の記述が jdk にとって冗長であることを知っているからです。
Java の賢いディスプレイスメント操作方法に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。