BitSet と integer/long の間のやり取り
-
20-09-2019 - |
質問
ビット操作を実行したい整数がある場合、それをどのようにロードできますか? java.util.BitSet
?int または long に変換するにはどうすればよいですか?大きさはあまり気にしてないのですが、 BitSet
-- 長さは常に 32 ビットまたは 64 ビットになります。ただ使いたいのですが、 set()
, clear()
, nextSetBit()
, 、 そして nextClearBit()
ビット演算子ではなくメソッドを使用しますが、数値型でビットセットを初期化する簡単な方法が見つかりません。
解決
次のコードは、長い値とその逆の設定ビット作成
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;
}
}
EDITED:今両方向、@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()
、あなたはBigInteger
を使用することができます - それはgetLowestSetBit
、setBit
とclearBit
メソッドを持っています(最後の二つではなく、イン変更の新しいBigInteger
を作成します。場所。)
'Streamyに' のように、バックの小さなのlong
から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)
}
あなたが探して何public void set(int bit)
方法はありませんか?