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

12,947

Solution 1

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.

Solution 2

Supposing you have a mask m with bits set to 1 for all the bits you want to set or clear, and 0 otherwise:

  • clear bits: x & (~m)
  • set bits: x | m
  • flip bits: x ^ m

If you are only interested in one bit, in position p (starting at 0), the mask is simple to express m = 1 << p

Note that I am using C-style conventions, where:

  • ~ is the 1-complement: ~10001010 = 01110101
  • & is the bitwise AND
  • | is the bitwise OR
  • ^ is the bitwise XOR
  • << is the left bit shift: 10001010 << 2 = 00101000

Solution 3

OR with 1 is always true; AND with 0 is always false. :)

Share:
12,947
Mithrax
Author by

Mithrax

Updated on June 06, 2022

Comments

  • Mithrax
    Mithrax almost 2 years

    Lets 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:

  • Mithrax
    Mithrax about 15 years
    Right, but what would my mask be? 0x0000? Do you see what I mean? When doing AND I need to have a mask, how do I specify zero's with just those positions as zero?
  • JP Alioto
    JP Alioto about 15 years
    If you want to keep what you have there do AND with 1, if you want to erase what you have there, AND with 0.
  • paxdiablo
    paxdiablo about 15 years
    @staticsan, I expanded with the bit operations to make it clearer, then +1'ed you since the answer is now so much better :-) Hope you don't mind.
  • paxdiablo
    paxdiablo about 15 years
    @Varkhan, I think you mean ~ is the ones-complement. Twos-complement of n is -n (~n + 1 from memory).
  • paxdiablo
    paxdiablo about 15 years
    That would work with 0x0448 but not any other number - you need 0xfff1 to leave all the other bits untouched.
  • chaos
    chaos about 15 years
    Yeah. Too bad there's no 'n' literal modifier.