繁体   English   中英

BitSet 和整数/长整数

[英]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如果它不太可能是性能瓶颈 - 它有getLowestSetBitsetBitclearBit方法(最后两个将创建一个新的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::valueOfBitSet::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM