How to set/unset a bit at specific position of a long?

前端 未结 5 485
粉色の甜心
粉色の甜心 2020-12-24 03:35

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

相关标签:
5条回答
  • 2020-12-24 03:37

    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);

    0 讨论(0)
  • 2020-12-24 03:42

    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
    
    0 讨论(0)
  • 2020-12-24 03:46

    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)
    
    0 讨论(0)
  • 2020-12-24 03:47
    • Convert long to a bitset
    • Set the bit you need to
    • Convert bitset back to long

    See this post BitSet to and from integer/long for methods to convert long to bitset and vice versa

    0 讨论(0)
  • 2020-12-24 03:57

    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
    
    0 讨论(0)
提交回复
热议问题