48


6

整数/ longとのBitSet

ビット操作を実行したい整数がある場合、どのようにそれを java.util.BitSet`にロードできますか? intまたはlongに戻すにはどうすればよいですか? `BitSet`のサイズについてはあまり心配していません。常に32ビットまたは64ビットの長さになります。 ビット単位の演算子ではなく、 `set()clear()nextSetBit()、および `nextClearBit()`メソッドを使用したいのですが、初期化する簡単な方法が見つかりません数値型で設定されたビット。

6 Answer


49


次のコードは、long値からビットセットを作成し、その逆も同様です。

public class Bits {

  public static BitSet convert(long value) {
    BitSet bits = new BitSet();
    int index = 0;
    while (value != 0L) {
      if (value % 2L != 0) {
        bits.set(index);
      }
      ++index;
      value = value >>> 1;
    }
    return bits;
  }

  public static long convert(BitSet bits) {
    long value = 0L;
    for (int i = 0; i < bits.length(); ++i) {
      value += bits.get(i) ? (1L << i) : 0L;
    }
    return value;
  }
}

編集:今、両方向、@ leftbrain:原因、あなたは正しい


29


finnw回答に追加:http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#valueOf-long:A- [BitSet.valueOf(long [])もあります。 `]およびhttp://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#toLongArray-- [ BitSet.toLongArray() `]。 So:

int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];


18


Java 7には `BitSet.valueOf(byte [])`と `BitSet.toByteArray()`があります

Java 6以前にこだわっている場合、パフォーマンスのボトルネックになる可能性が低い場合は「BigInteger」を使用できます。「getLowestSetBit」、「setBit」、「clearBit」メソッドがあります(最後の2つは新しい「インプレースで変更する代わりにBigInteger`)


3


_'streamy'_方法で* small * BitSet`から long`を取得するには:

long l = bitSet.stream()
        .takeWhile(i -> i < Long.SIZE)
        .mapToLong(i -> 1L << i)
        .reduce(0, (a, b) -> a | b);

逆に:

BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
        .filter(i -> 0 != (l & 1L << i))
        .collect(BitSet::new, BitSet::set, BitSet::or);
N.B .: `BitSet

valueOf`と` BitSet :: toLongArray`の使用はもちろん簡単です。


1


nextSetBitのドキュメントからかなりまっすぐ

value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
 value += (1 << i)
 }


-3


`public void set(int bit)`メソッドはあなたの探しているものではありませんか?