void appBitsCpy( uint8* Dest, int32 DestBit, uint8* Src, int32 SrcBit, int32 BitCount )
{
if( BitCount==0 ) return;
// Special case - always at least one bit to copy,
// a maximum of 2 bytes to read, 2 to write - only touch bytes that are actually used.
if( BitCount <= 8 )
{
uint32 DestIndex = DestBit/8;
uint32 SrcIndex = SrcBit /8;
uint32 LastDest =( DestBit+BitCount-1 )/8;
uint32 LastSrc =( SrcBit +BitCount-1 )/8;
uint32 ShiftSrc = SrcBit & 7;
uint32 ShiftDest = DestBit & 7;
uint32 FirstMask = 0xFF << ShiftDest;
uint32 LastMask = 0xFE << ((DestBit + BitCount-1) & 7) ; // Pre-shifted left by 1.
uint32 Accu;
if( SrcIndex == LastSrc )
Accu = (Src[SrcIndex] >> ShiftSrc);
else
Accu =( (Src[SrcIndex] >> ShiftSrc) | (Src[LastSrc ] << (8-ShiftSrc)) );
if( DestIndex == LastDest )
{
uint32 MultiMask = FirstMask & ~LastMask;
Dest[DestIndex] = ( ( Dest[DestIndex] & ~MultiMask ) | ((Accu << ShiftDest) & MultiMask) );
}
else
{
Dest[DestIndex] = (uint8)( ( Dest[DestIndex] & ~FirstMask ) | (( Accu << ShiftDest) & FirstMask) ) ;
Dest[LastDest ] = (uint8)( ( Dest[LastDest ] & LastMask ) | (( Accu >> (8-ShiftDest)) & ~LastMask) ) ;
}
return;
}