![](/img/trans.png)
[英]What is the most efficient way in Java to sign extend an arbitrary length pattern of bits?
[英]What is the most efficient way in Java to pack bits into byte[] and read it back?
我目前使用這兩個函數來打包和讀取字節數組中的位。 想知道是否有人有更好的想法或更快的方法嗎?
通過更多優化編輯程序並提出一些計算。 目前100mil的Put and 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按位運算快得多。 它會占用一些堆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.