Каков наиболее эффективный способ в Java для пакетных бит в байт [] и прочитать его обратно?

В настоящее время я использую эти две функции для упаковки и чтения бит в массиве байтов. Интересно, есть ли у кого-нибудь лучшие идеи или более быстрые способы сделать это?

Отредактировал программу с помощью нескольких оптимизаций и сделал несколько расчетов. В настоящее время 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;
    }
}

Ответ 1

Совершенно другой маршрут состоял бы в том, чтобы определить статическую таблицу всех возможных комбинаций и выполнить поиск вместо вычисления результатов каждый раз. Я так думаю, что они делают это в криптографии. array [i] x 3 должен быть намного быстрее, чем numBits побитовые операции. Он будет занимать кучу, хотя.