11

私は現在、これら2つの関数を使用して、バイト配列のビットをパックして読み取ります。誰かがそれを行うためのより良いアイデアやより速い方法を持っているかどうか疑問に思いますか?

さらにいくつかの最適化を使用してプログラムを編集し、いくつかの計算を表にしました。現在、100milのPut and Getは、16秒ではなく約12秒かかります。

誰かが現在のコードを使用している場合は、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;
    }
}
4

1 に答える 1

12

まったく異なるルートは、すべての可能な組み合わせの静的テーブルを定義し、毎回結果を計算する代わりにルックアップを実行することです。それが彼らが暗号化でそれを行う方法だと思います。array [i] x 3は、numBitsのビット演算よりもはるかに高速である必要があります。ただし、ヒープを占有します。

于 2011-09-30T03:16:59.953 に答える