Hey, in the Programming Pearls book, there is a source code for setting, clearing and testing a bit of the given index in an array of ints that is actually a set representation.
The code is the following:
#include<stdio.h>
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1+ N/BITSPERWORD];
void set(int i)
{
a[i>>SHIFT] |= (1<<(i & MASK));
}
void clr(int i)
{
a[i>>SHIFT] &= ~(1<<(i & MASK));
}
int test(int i)
{
a[i>>SHIFT] & (1<<(i & MASK));
}
Could somebody explain me the reason of the SHIFT and the MASK defines? And what are their purposes in the code?
I've already read the previous related question.
Setting a bit: If Kth bit is 0, then set it to 1. Otherwise, leave it unchanged. Clearing a bit: If Kth bit is 1, then clear it to 0. Otherwise, leave it unchanged.
Use the bitwise AND operator ( & ) to clear a bit.
Clearing a bit means that if K-th bit is 1, then clear it to 0 and if it is 0 then leave it unchanged. Toggling a bit means that if K-th bit is 1, then change it to 0 and if it is 0 then change it to 1.
VonC posted a good answer about bitmasks in general. Here's some information that's more specific to the code you posted.
Given an integer representing a bit, we work out which member of the array holds that bit. That is: Bits 0 to 31 live in a[0]
, bits 32 to 63 live in a[1]
, etc. All that i>>SHIFT
does is i / 32
. This works out which member of a
the bit lives in. With an optimising compiler, these are probably equivalent.
Obviously, now we've found out which member of a
that bitflag lives in, we need to ensure that we set the correct bit in that integer. This is what 1 << i
does. However, we need to ensure that we don't try to access the 33rd bit in a 32-bit integer, so the shift operation is constrained by using 1 << (i & 0x1F)
. The magic here is that 0x1F
is 31, so we'll never left-shift the bit represented by i
more than 31 places (otherwise it should have gone in the next member of a
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With