ビット操作を実行したい整数がある場合、どのように_Java.util.BitSet
_にロードできますか? intまたはlongに戻すにはどうすればよいですか? BitSet
のサイズについてはあまり心配していません。常に32ビットまたは64ビットの長さになります。ビット単位の演算子ではなく、set()
、clear()
、nextSetBit()
、およびnextClearBit()
メソッドを使用したいだけですが、 tビットセットを数値型で初期化する簡単な方法を見つけます。
次のコードは、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:原因、あなたは正しい
Finnwの回答に追加: BitSet.valueOf(long[])
および BitSet.toLongArray()
もあります。そう:
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
Java 7にはBitSet.valueOf(byte[])
およびBitSet.toByteArray()
があります
Java 6以前の場合、パフォーマンスのボトルネックになる可能性が低い場合はBigInteger
を使用できます。getLowestSetBit
、setBit
およびclearBit
メソッド(最後の2つは、インプレース変更する代わりに新しいBigInteger
を作成します。)
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::valueOf
とBitSet::toLongArray
の使用はもちろん簡単です。
NextSetBitのドキュメントからかなりまっすぐ
value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}