gpt4 book ai didi

java - Java 中将位打包到 byte[] 并读回的最有效方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:28:41 24 4
gpt4 key购买 nike

我目前使用这两个函数来打包和读取字节数组中的位。想知道是否有人有更好的想法或更快的方法来做到这一点?

编辑了程序并进行了一些优化并列出了一些计算。目前 1 亿次 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;
}
}

最佳答案

一个完全不同的路线是定义所有可能组合的静态表并执行查找而不是每次都计算结果。我认为这就是他们在密码学中的做法。 array[i] x 3 应该比 numBits 按位运算快得多。不过它会占用一些堆。

关于java - Java 中将位打包到 byte[] 并读回的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com