Open manikantag opened 9 years ago
valueOf
can be implemented like below: (byte[] to bit extraction logic taken from http://stackoverflow.com/a/1034513/340290)
public static SparseBitSet valueOf(byte[] bytes) {
SparseBitSet sparseBitSet = new SparseBitSet();
int j = 0;
for (byte b : bytes) {
for (int mask = 0x01; mask != 0x100; mask <<= 1) {
if((b & mask) != 0) {
sparseBitSet.set(j);
}
j++;
}
}
return sparseBitSet;
}
Similar method for toByteArray
will make it easy to store the SparseBitSet as a hex or base64 string.
I did a simple benchmark to see which faster among BitSet & SparseBitSet to create from byte[].
SparseBitSet is taking ~10 times more time than BitSet.valueOf()
. I m not sure if this is due to the above implementation of SparseBitSet.valueOf()
.
Can we improve this? Below is the very rudementary main()
for testing:
public static void main(String[] args) throws DecoderException {
int[] intArray = new int[] {0,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0};
BitSet bitSet = new BitSet();
SparseBitSet sparseBitSet = new SparseBitSet();
for(int i = 0; i < intArray.length; i++) {
bitSet.set(i, intArray[i] == 1);
sparseBitSet.set(i, intArray[i] == 1);
}
System.out.println("BitSet original : " + bitSet);
System.out.println("SparseBitSet original: " + sparseBitSet);
String hexStr = Hex.encodeHexString(bitSet.toByteArray()); // BitSet --> Hex
byte[] decodeHex = Hex.decodeHex(hexStr.toCharArray()); // Hex -> byte[]
System.out.println("SparseBitSet decoded : " + sparseBitSetValueOf(decodeHex));
// BitSet Hex
long start1 = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
BitSet.valueOf(decodeHex);
}
long end1 = System.currentTimeMillis();
System.out.println("BitSet Hex total time: " + (end1 - start1));
// SparseBitSet Hex
long start3 = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
sparseBitSetValueOf(decodeHex);
}
long end3 = System.currentTimeMillis();
System.out.println("SparseBitSet Hex total time: " + (end3 - start3));
}
@manikantag
SparseBitSet is serializable. Why don't you serialize and deserialize it instead?
Hi,
Would be great if we've something like
BitSet.valueOf()
& 'BitSet.toByteArray()' in SparseBitSet too. Currently it is not direct to initialise SparseBitSet frombyte[]