[英]BitSet to and from integer/long
如果我有一个 integer 我想对其执行位操作,我如何将它加载到java.util.BitSet
? 如何将它转换回 int 或 long? 我不太关心BitSet
的大小——它总是 32 或 64 位长。 我只想使用set()
、 clear()
、 nextSetBit()
和nextClearBit()
方法而不是按位运算符,但我找不到用数字类型初始化位集的简单方法。
以下代码从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
方法(最后两个将创建一个新的BigInteger
而不是就地修改。)
要以“流”的方式从一个小的 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);
注意:使用BitSet::valueOf
和BitSet::toLongArray
当然更容易。
几乎直接来自nextSetBit的文档
value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}
上面@Arne Burmeister 的 kotlin 翻译:
object Bits {
fun convert(value: Long): BitSet {
var value = value
val bits = BitSet()
var index = 0
while (value != 0L) {
if (value % 2L != 0L) {
bits.set(index)
}
++index
value = value ushr 1
}
return bits
}
fun convert(bits: BitSet): Long {
var value = 0L
for (i in 0 until bits.length()) {
value += if (bits.get(i)) 1L shl i else 0L
}
return value
}
}
是不是你要找的public void set(int bit)
方法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.