I have a 32-bit unsigned int and I need to extract bits at given positions and make a new number out of those bits. For example, if I have a 0xFFFFFFFF and want bits 0,10,11 my
Beware, untested code:
for(i = 0; i < count; i++)
{
bitmask = 1 << positions[i];
bit = (bytes & bitmask)!=0;
result = (result << 1)|bit;
}
Since you are picking off individual bits, there's no reason to make the bit mask a variable; just shift the desired bit into the units bit, and use a mask of 1. E.g.:
...
result = (2*result) | ((bytes >> positions[i]) & 1);
...
Many compilers generate the same code for 2*result
and result<<1
, so use whichever you like.
Note, if you are designing the interface and don't have good reasons for using short
integers for positions[]
and count
as you do, then don't. Be consistent and specify all the integers the same way.