添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

If I have an integer that I'd like to perform bit manipulation on, how can I load it into a java.util.BitSet ? How can I convert it back to an int or long? I'm not so concerned about the size of the BitSet -- it will always be 32 or 64 bits long. I'd just like to use the set() , clear() , nextSetBit() , and nextClearBit() methods rather than bitwise operators, but I can't find an easy way to initialize a bit set with a numeric type.

Personally, I'd say raw bit manipulation is the way to go here. It really isn't that complicated, and as you say I don't see a simple way to get an int or long into a BitSet. Michael Myers Mar 18, 2010 at 22:07

The following code creates a bit set from a long value and vice versa:

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: Now both directions, @leftbrain: of cause, you are right

Add to finnw answer: there are also BitSet.valueOf(long[]) and BitSet.toLongArray(). So:

int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
                If the bitset has no "1", bs.toLongArray()[0] will throw ArrayIndexOutOfBoundsException exception!
– Qianyue
                Sep 14, 2021 at 8:17
BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
        .filter(i -> 0 != (l & 1L << i))
        .collect(BitSet::new, BitSet::set, BitSet::or);

N.B.: Using BitSet::valueOf and BitSet::toLongArray is of course easier.

This will fail for a BitSet larger than 32 or 64 bits, in such a case you'll need to handle an int[] or long[] at the output. But OP explicitly doesn't care, so fair enough. Just a few minor glitches: in case of a long you should 1L << i, to prevent overflow, and an OR like value |= 1L << i is enough. – charlie Jul 4, 2016 at 12:46 That sets one single bit with the index you provide. I'd like to set each bit that's set in the integer. – ataylor Mar 18, 2010 at 22:17

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.