代码之家  ›  专栏  ›  技术社区  ›  ataylor

位设置为整数/长

  •  48
  • ataylor  · 技术社区  · 16 年前

    如果我有一个整数要对其执行位操作,如何将其加载到 java.util.BitSet ? 如何将其转换回int或long?我不太关心房子的大小 BitSet --它总是32或64位长。我只想用 set() clear() , nextSetBit() ,和 nextClearBit() 方法而不是按位运算符,但是我找不到一种简单的方法来初始化具有数字类型的位集。

    6 回复  |  直到 9 年前
        1
  •  62
  •   Arne Burmeister    14 年前

    以下代码从长值创建位集,反之亦然:

    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;
      }
    }
    

        2
  •  43
  •   Bobulous    11 年前

    加上芬恩的回答:还有 BitSet.valueOf(long[]) BitSet.toLongArray()

    int n = 12345;
    BitSet bs = BitSet.valueOf(new long[]{n});
    long l = bs.toLongArray()[0];
    
        3
  •  19
  •   finnw    14 年前

    Java7有 BitSet.valueOf(byte[]) BitSet.toByteArray()

    如果您一直使用Java6或更早版本,您可以使用 BigInteger 如果它不太可能成为性能瓶颈,那么它必须 getLowestSetBit setBit clearBit 大整数 而不是就地修改。)

        4
  •  3
  •   charlie    10 年前

    得到一个 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);
    

    BitSet::valueOf BitSet::toLongArray 当然更容易。

        5
  •  1
  •   user3799584    12 年前

    value=0;
    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
     value += (1 << i)
     }
    
        6
  •  -3
  •   kukudas    16 年前

    public void set(int bit) 你在找什么?