If you want to manipulate the bit in BYTE array, following functions are useful to you.
BYTE GetBit(BYTE* pBuffer, int nBit)
{
int bitOffset = nBit & 7;
BYTE ret = pBuffer[nBit >> 3] >> bitOffset;
ret &= 1;
return ret;
}
void SetBit(BYTE* pBuffer, int nBit)
{
BYTE val = 1 << (nBit & 7);
pBuffer[nBit >> 3] |= val;
}
For the GetBit, nBit is the bit offset you want to test.
nBit & 7 is equal to nBit % 8, it will get bit offset for input parameter nBit.
nBit >> 3 is equal to nBit / 8, it will get the byte offset in Byte array.
Why we use bit operations instead of mod and div operation? The reason is simple, for the bit operation, it will generate more fast and simple assembly code. You could see my build result like:
; 160 : unsigned int modVal = i % 8;
mov eax, DWORD PTR _i$[ebp]
xor edx, edx
mov ecx, 8
div ecx
mov DWORD PTR _modVal$[ebp], edx
; 161 :
; 162 : unsigned int andVal = i & 7;
mov eax, DWORD PTR _i$[ebp]
and eax, 7
mov DWORD PTR _andVal$[ebp], eax
The code is generated by VC2008 and disabled optimization. For mod operation "i % 8", it has "div" and will be slow then "i & 7".