brettwooldridge / SparseBitSet

An efficient sparse bit set implementation for Java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BitSet.valueOf(), toByteArray() similar methods

manikantag opened this issue · comments

Hi,

Would be great if we've something like BitSet.valueOf() & 'BitSet.toByteArray()' in SparseBitSet too. Currently it is not direct to initialise SparseBitSet from byte[]

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?