Reputation: 7809
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:
Upvotes: 10
Views: 15389
Reputation: 4525
Let’s make sure that bits are counted from 0 starting at the right side or least significant bit and going left. Then observe this:
1 <<p puts 1 at the position p, for example
1 <<3 = 00001000
1 <<p - 1 puts 1 at all positions up to p, exclusive
1 <<3-1=00000111
The last step produced a mask to clear bits from the most significant to p inclusive. You can invert it with tilde to clear the other half.
Upvotes: 0
Reputation: 16761
Supposing you have a mask m with bits set to 1 for all the bits you want to set or clear, and 0 otherwise:
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:
Upvotes: 4
Reputation: 30555
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.
Upvotes: 19
Reputation: 13974
Assuming your OR 0x14 is correct, clearing would be:
AND (NOT 0x14)
Upvotes: 0