これはかなり簡単に思えますが、答えが見つかりません。私がintXを持っている場合、JavaでこのintからN個の最下位ビットを取得するための最良の方法は何ですか?
3 に答える
これは、すべての非負のN<3332で機能するはずです。
x & ((1 << N) - 1)
これがどのように機能するかについて詳しく説明する価値がN == 31 あります。についてN == 32N == 31は、を取得し1 << N == Integer.MIN_VALUEます。それから1を引くと、JavaはサイレントににラップアラウンドしInteger.MAX_VALUEます。これはまさに必要なものです。の場合N == 32、1ビットは完全にシフトアウトされるため1 << N == 0、; 次に(1 << N) - 1 == -1、すべて32ビットが設定されます。
の場合N == 32、残念ながらこれは機能しません。(ありがとう、@ zstring!)<<演算子は、右側のmod 32だけシフトするためです。代わりに、その場合の特別なテストを避けたい場合は、次を使用できます。
x & ((int)(1L << N) - 1)
をシフトするlongと、完全な32ビットシフトが得られます。これは、にキャストバックした後、 0になりますint。1を引くと-1になり、任意の値(およびの下位32ビットの値)になります。x & -1xintxxx
テッドのアプローチの方が速い可能性がありますが、別のアプローチを次に示します。
x << -N >>> -N
これにより、すべてのビットが上にシフトされ、次に下にシフトされて、上位ビットが切り取られます。
int i = -1;
System.out.println(Integer.toBinaryString(i));
i = i << -5 >>> -5;
System.out.println(Integer.toBinaryString(i));
版画
11111111111111111111111111111111
11111