Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java BitSet which allows easy Concatenation of BitSets

I have a need for a BitSet which allows easy concatenation of multiple BitSets create a new BitSet. The default implementation doesn't have such a method.

Is there any an implementation in some external library that any of you know which allows easy concatenation?

For example lets say I have a bitarray 11111 and another bit array 010101. I want functionality like appending. So after concatenating it would result in 11111010101.

like image 937
Can't Tell Avatar asked May 08 '12 09:05

Can't Tell


People also ask

What is the use of BitSet in Java?

Sets the bits from the specified fromIndex (inclusive) to the specified toIndex (exclusive) to the specified value. Returns the number of bits of space actually in use by this BitSet to represent bit values.

What is the purpose of BitSet class explain various functions available?

The BitSet class extends the Object class and provides the implementation of Serializable and Cloneable interfaces. Each component of bit set contains at least one Boolean value. The contents of one BitSet may be changed by other BitSet using logical AND, logical OR and logical exclusive OR operations.


2 Answers

Well there's no way to implement this terribly efficient (performance and memory that is) since there's no leftshift method.

What you can do is either use the obvious nextSetBit for loop - slow, but memory efficient.

The presumably faster method would be to use toLongArray on one, copy that correctly shifted into a large enough array, create a bitset from that and or it with the other. That way you don't do any bitshifting on single bits but instead work on wordsized chunks.

like image 172
Voo Avatar answered Oct 13 '22 00:10

Voo


This worked for me:

BitSet concatenate_vectors(BitSet vector_1_in, BitSet vector_2_in) {
  BitSet vector_1_in_clone = (BitSet)vector_1_in.clone();
  BitSet vector_2_in_clone = (BitSet)vector_2_in.clone();
  int n = 5;//_desired length of the first (leading) vector
  int index = -1;
  while (index < (vector_2_in_clone.length() - 1)) {
    index = vector_2_in_clone.nextSetBit((index + 1));
    vector_1_in_clone.set((index + n));
  }
  return vector_1_in_clone;
}

Result: 11111010101

like image 40
Waylon Barrett Avatar answered Oct 12 '22 22:10

Waylon Barrett