import java.util.Arrays; import java.util.BitSet; import redis.clients.jedis.Jedis; public class SieveOfEratosthenes { /** * @param args */ public static void main(final String[] args) { // setup values final Jedis redis = new Jedis("localhost"); final String sieveSetBit = "sieveSetBit"; final String sieveSetKey = "sieveSetKey"; final int length = 20; final BitSet sieve = new BitSet(length); sieve.flip(2, length); // create bitset of all values for (int i = 0; i < length; i++) { if (sieve.get(i)) { for (int j = i * 2; j < length; j += i) { sieve.set(j, false); } } } // Write 2 bitsets to redis // 1. setbit through redis for (int i = 0; i < sieve.length(); i++) { if (sieve.get(i)) { redis.setbit(sieveSetBit, i, true); } } // 2. Set entire bitset redis.set(sieveSetKey.getBytes(), sieve.toByteArray()); // Compare bitsets from Redis when retrieved via getKey final String sieveBitString = redis.get(sieveSetBit); final String sieveKeyString = redis.get(sieveSetKey); final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes()); final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes()); final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes()); final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes()); final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes()); final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes()); System.out.println(Arrays.toString(sieve.toByteArray())); System.out.println(sieve + " <== Original Sieve"); System.out.println(); System.out.println(Arrays.toString(sieveBitString.getBytes())); System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()"); System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()"); System.out.println(); System.out.println(Arrays.toString(sieveKeyString.getBytes())); System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()"); System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()"); System.out.println(); System.out.println(Arrays.toString(sieveKeyBytes)); System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()"); System.out.println(); System.out.println(Arrays.toString(sieveBitBytes)); System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()"); System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()"); System.out.println(); System.out.println(Arrays.toString(sieveBitBytes)); System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()"); System.out.println(toByteArrayReverse(sieve) + " <== reverse To Array before storages -> toByteArrayReverse()"); } public static BitSet fromByteArrayReverse(final byte[] bytes) { final BitSet bits = new BitSet(); for (int i = 0; i < bytes.length * 8; i++) { if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) { bits.set(i); } } return bits; } public static BitSet fromByteArray(final byte[] bytes) { final BitSet bits = new BitSet(); for (int i = 0; i < bytes.length * 8; i++) { if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) { bits.set(i); } } return bits; } public static byte[] toByteArrayReverse(BitSet bits) { final byte[] bytes = new byte[bits.length() / 8 + 1]; for (int i = 0; i < bits.length(); i++) { if (bits.get(i)) { int value = bytes[i/8] | (1 <<( 7 -(i%8))); bytes[i/8] = (byte) value; } } return bytes; } }