12

これはかなり簡単に思えますが、答えが見つかりません。私がintXを持っている場合、JavaでこのintからN個の最下位ビットを取得するための最良の方法は何ですか?

4

3 に答える 3

13

これは、すべての非負の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 & -1xintxxx

于 2012-10-07T06:19:36.523 に答える
4

テッドのアプローチの方が速い可能性がありますが、別のアプローチを次に示します。

x << -N >>> -N

これにより、すべてのビットが上にシフトされ、次に下にシフトされて、上位ビットが切り取られます。

int i = -1;
System.out.println(Integer.toBinaryString(i));
i = i << -5 >>> -5;
System.out.println(Integer.toBinaryString(i));

版画

11111111111111111111111111111111
11111
于 2012-10-07T06:57:04.053 に答える