views:

457

answers:

6

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:

+1  A: 

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

JP Alioto
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?
Mithrax
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.
JP Alioto
A: 

Assuming your OR 0x14 is correct, clearing would be:

AND (NOT 0x14)

CookieOfFortune
The 0x14 wasn't correct BTW, it was 14 (0xe).
paxdiablo
+3  A: 

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
Varkhan
@Varkhan, I think you mean ~ is the ones-complement. Twos-complement of n is -n (~n + 1 from memory).
paxdiablo
@Pax Oops... typo... fixed.
Varkhan
+7  A: 

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.

staticsan
@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
A: 

for clearing the bits use AND with 0x440

Chand
That would work with 0x0448 but not any other number - you need 0xfff1 to leave all the other bits untouched.
paxdiablo
A: 
number &= ~0xe
chaos
Yeah. Too bad there's no 'n' literal modifier.
chaos