В настоящее время я использую эти две функции для упаковки и чтения бит в массиве байтов. Интересно, есть ли у кого-нибудь лучшие идеи или более быстрые способы сделать это?
Отредактировал программу с помощью нескольких оптимизаций и сделал несколько расчетов. В настоящее время 100 мил Put и Get занимает около 12 секунд вместо 16 секунд.
Если кто-то использует текущий код, убедитесь, что значение, переданное в Put, является положительным числом, так как оно ожидает, что числа без знака опустится. Если есть интерес, я могу установить подписанные и неподписанные версии.
class BitData
{
static void Put(byte Data[], final int BitOffset, int NumBits, final int Value)
{
final long valLong=(Value&((1L<<NumBits)-1L));
int posByte=BitOffset>>3;
int posBit=BitOffset&7;
int valByte;
int ModifyBits;
long lValue;
int LeftShift;
ModifyBits=8-posBit;
if(NumBits<ModifyBits) ModifyBits=NumBits;
LeftShift=(8-posBit-ModifyBits);
while(true)
{
valByte = Data[posByte];
if(ModifyBits==8)
{
lValue=valLong<<(32-NumBits)>>(24);
Data[posByte]=(byte)lValue;
}
else
{
lValue=valLong<<(32-NumBits)>>(32-ModifyBits)<<LeftShift;
Data[posByte]=(byte)((valByte & ~(((1<<ModifyBits)-1) << LeftShift)) | lValue);
}
NumBits-=ModifyBits;
if(NumBits==0) break;
posByte++;
ModifyBits=8;
if(NumBits<ModifyBits)
{
ModifyBits=NumBits;
LeftShift=(8-ModifyBits);
}
}
}
static int GetInt(byte Data[], final int BitOffset, int NumBits)
{
int posByte=BitOffset>>3;
int posBit=BitOffset&7;
long Value=0;
int ModifyBits;
int valByte;
int LeftShift;
ModifyBits=8-posBit;
if(NumBits<ModifyBits) ModifyBits=NumBits;
LeftShift=(8-posBit-ModifyBits);
while(true)
{
valByte = Data[posByte] & 0xff;
if(ModifyBits==8) Value+=valByte;
else Value+=(valByte & ((1<<ModifyBits)-1) << LeftShift) >> LeftShift;
NumBits-=ModifyBits;
if(NumBits==0) break;
posByte++;
ModifyBits=8;
if(NumBits<ModifyBits)
{
ModifyBits=NumBits;
LeftShift=(8-ModifyBits);
}
Value<<=ModifyBits;
}
return (int)Value;
}
}