How to set/unset a bit at specific position of a long in Java ?
For example,
long l = 0b001100L ; // bit representation
I want to s
Please see the class java.util.BitSet that do the job for you.
To set : myByte.set(bit);
To reset : myByte.clear(bit);
To fill with a bool : myByte.set(bit, b);
To get the bool : b = myByte.get(bit);
I would choose BigInteger for this...
class Test {
public static void main(String[] args) throws Exception {
Long value = 12L;
BigInteger b = new BigInteger(String.valueOf(value));
System.out.println(b.toString(2) + " " + value);
b = b.setBit(1);
b = b.clearBit(2);
value = Long.valueOf(b.toString());
System.out.println(b.toString(2) + " " + value);
}
}
and here is the output:
1100 12
1010 10
The least significant bit (lsb) is usually referred to as bit 0, so your 'position 2' is really 'bit 1'.
long x = 0b001100; // x now = 0b001100
x |= (1<<1); // x now = 0b001110 (bit 1 set)
x &= ~(1<<2); // x now = 0b001010 (bit 2 cleared)
See this post BitSet to and from integer/long for methods to convert long to bitset and vice versa
To set a bit, use:
x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB
to erase a bit use:
x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB
to toggle a bit use:
x ^= 0b1;
Notice I use 0b?. You can also use any integer, eg:
x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit
However, it makes it harder to know which bit is being changed.
Using binary allows you to see which exact bits will be set/erased/toggled.
To dynamically set at bit, use:
x |= (1 << y); // set the yth bit from the LSB
(1 << y)
shifts the ...001 y places left, so you can move the set bit y places.
You can also set multiple bits at once:
x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB
Or to unset:
x &= ~((1 << y) | (1 << z)); // unset yth and zth bit
Or to toggle:
x ^= (1 << y) | (1 << z); // toggle yth and zth bit