web-dev-qa-db-ja.com

整数/ longとのBitSet

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

51
ataylor

次のコードは、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:原因、あなたは正しい

52
Arne Burmeister

Finnwの回答に追加: BitSet.valueOf(long[]) および BitSet.toLongArray() もあります。そう:

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

Java 7にはBitSet.valueOf(byte[])およびBitSet.toByteArray()があります

Java 6以前の場合、パフォーマンスのボトルネックになる可能性が低い場合はBigIntegerを使用できます。getLowestSetBitsetBitおよびclearBitメソッド(最後の2つは、インプレース変更する代わりに新しいBigIntegerを作成します。)

18
finnw

smalllongから 'streamy'の方法でBitSetを取得するには:

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::valueOfBitSet::toLongArrayの使用はもちろん簡単です。

3
charlie

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

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