Search code examples
language-agnosticbit-manipulation

How do I set or clear the first 3 bits using bitwise operations?


Let’s say I have a number like 0x448. In binary this is 0100 0100 1000.

How do I set the bits 1, 2 and 3 to either all 0's or all 1's using bit-wise operations? When I say the first three, I'm counting the rightmost bit as the zero bit.

So, for example

Bits as 1's:

b12            b0
  0100 0100 1110
            ^^^

Bits as 0's:

b12            b0
  0100 0100 0000
            ^^^

I'm guessing that to set them to 1's I use bit-wise OR with a mask of 14 (0x000e)? But if that is the case, how do I do something similar for clearing the bits?


Related:


Solution

  • You have the bit setting correct: OR with the mask of the bits you want to set.

    Bit clearing bits is very similar: AND with the ones-complement of the bits you want cleared.

    Example: Word of 0x0448.

    Settings bits 1, 2 and 3 would be Word OR 0x000e:

        0000 0100 0100 1000 = 0x0448
     OR 0000 0000 0000 1110 = 0x000e
        ---- ---- ---- ----
      = 0000 0100 0100 1110 = 0x044e
    

    Clearing bits 1, 2 and 3 would be Word AND 0xfff1:

        0000 0100 0100 1000 = 0x0448
    AND 1111 1111 1111 0001 = 0xfff1
        ---- ---- ---- ----
      = 0000 0100 0100 0000 = 0x0440
    

    Elaborating on the ones-complement, the AND pattern for clearing is the logical NOT of the OR pattern for setting (each bit reveresed):

     OR 0000 0000 0000 1110 = 0x000e
    AND 1111 1111 1111 0001 = 0xfff1
    

    so you can use your favorite language NOT operation instead of having to figure out both values.