I’m trying to convert my code from using bitwise operations on Long type to the same operations on a BitSet, but I can’t find the right syntax.
This is the original code:
public class BitwiseOperationsWithLong { private static final long SETS_OF_BITS_LONG = 141655L; //... private static int calculate(long setsOfBits) { int counter = 0; for (int i = 0; i < 10; i++) { boolean result = ((1L << i) & SETS_OF_BITS_IN_LONG) != 0L; if (result) { counter++; } } return counter; }
And this how I try to convert to BitSet:
public class BitwiseOperationsWithBitSet { private static final String SETS_OF_BITS_STRING = "100010100101010111"; private static BitSet SETS_OF_BITS_BITSET = bitSetFromString(SETS_OF_BITS_STRING); //... private static int calculate(BitSet setsOfBits) { int counter = 0; for (int i = 0; i < 10; i++) { //the line below is the problematic one boolean result = ((1 << i).and(SETS_OF_BITS_IN_LONG)) != 0; if (result) counter++; } return counter; } //method that sets BitSet from String of bits private static BitSet bitSetFromString(String binary) { BitSet bitset = new BitSet(binary.length()); for (int i = 0; i < binary.length(); i++) { if (binary.charAt(i) == '1') { bitset.set(i); } } return bitset; } }
I can’t find the right syntax for this line:
boolean result = ((1 << i).and(SETS_OF_BITS_IN_LONG)) != 0;
I did manage to use the and
syntax (instead of &
), but I can’t find out how to convert the left shift operation part to BitSet. (I am getting The operator & is undefined for the argument type(s) int, BitSet
)
Advertisement
Answer
When using BitSet
you don’t need to do the shifting and &
ing yourself – the BitSet
class has methods for this.
Also you could initialize your BitSet
directly from a long constant.
Taking this together your code can look like this:
import java.util.BitSet; public class BitwiseOperationsWithBitSet { private static final long SETS_OF_BITS_LONG = 141655L; private static BitSet SETS_OF_BITS_BITSET = BitSet.valueOf(new long[]{SETS_OF_BITS_LONG}); private static int calculate(BitSet setsOfBits) { int counter = 0; for (int i = 0; i < 10; i++) { boolean result = setsOfBits.get(i); if (result) counter++; } return counter; } }