これはかなり簡単に思えますが、答えが見つかりません。私がintXを持っている場合、JavaでこのintからN個の最下位ビットを取得するための最良の方法は何ですか?
3 に答える
これは、すべての非負のN<3332で機能するはずです。
x & ((1 << N) - 1)
これがどのように機能するかについて詳しく説明する価値がN == 31
あります。についてN == 32
N == 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 & -1
x
int
x
x
x
テッドのアプローチの方が速い可能性がありますが、別のアプローチを次に示します。
x << -N >>> -N
これにより、すべてのビットが上にシフトされ、次に下にシフトされて、上位ビットが切り取られます。
int i = -1;
System.out.println(Integer.toBinaryString(i));
i = i << -5 >>> -5;
System.out.println(Integer.toBinaryString(i));
版画
11111111111111111111111111111111
11111