Quel est le moyen le plus efficace en Java de compresser des bits dans byte et de les relire?

J’utilise actuellement ces deux fonctions pour compresser et lire des bits dans un tableau d’octets. Vous vous demandez si quelqu’un a de meilleures idées ou des moyens plus rapides de le faire?

Édité le programme avec quelques optimisations supplémentaires et présenté quelques calculs. Actuellement, 100mil Put and Get prend environ 12 secondes au lieu de 16 secondes maintenant.

Si quelqu’un utilise le code actuel, assurez-vous que la valeur transmise à Put est un nombre positif, car elle attend des nombres non signés. S’il y a un intérêt, je peux mettre en place des versions signées et non signées.

class BitData { static void Put(byte Data[], final int BitOffset, int NumBits, final int Value) { final long valLong=(Value&((1L<>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<>(24); Data[posByte]=(byte)lValue; } else { lValue=valLong<>(32-ModifyBits)<<LeftShift; Data[posByte]=(byte)((valByte & ~(((1<<ModifyBits)-1) << LeftShift)) | lValue); } NumBits-=ModifyBits; if(NumBits==0) break; posByte++; ModifyBits=8; if(NumBits>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; NumBits-=ModifyBits; if(NumBits==0) break; posByte++; ModifyBits=8; if(NumBits<ModifyBits) { ModifyBits=NumBits; LeftShift=(8-ModifyBits); } Value<<=ModifyBits; } return (int)Value; } } 

Un itinéraire totalement différent consisterait à définir un tableau statique de toutes les combinaisons possibles et à effectuer une recherche au lieu de calculer les résultats à chaque fois. Je pense que c’est comme ça qu’ils le font en cryptographie. array [i] x 3 devrait être beaucoup plus rapide que numBits opérations bit à bit. Il va occuper un peu de tas cependant.