このタスクを達成するための厄介で非効率的な方法をいくつか思いつくことができますが、最善の方法は何か疑問に思っています。
たとえば、バイトの 3 ビット目から 10 バイトをコピーし、通常どおりポインターにコピーしたいとします。
一度に 1 つのシフトされたバイトをコピーするよりも良い方法はありますか?
ありがとう
一般的なアプローチは、ソース バッファを可能な限り効率的に読み取り、必要に応じてそれをシフトして宛先バッファに書き込むことです。
バイト操作を行う必要はありません。最初に最大 3 バイトを実行することで、操作の大部分に対して常にソース読み取りlong
を整列させることができます。ソース バッファの長さ。
読み取った値から、必要に応じてシフトして目的のビット アラインメントを取得し、宛先への書き込み用に完成したバイトを組み立てます。できる限り広いアラインメントされたワードサイズへの書き込みの同じ最適化を行うこともできます。
可変幅トークン (zlib、MPEG、TIFF、および JPEG のすべてが思い浮かびます) を多用する圧縮ツールまたはライブラリのソースを掘り下げると、入力または出力バッファーを次のように扱うサンプル コードが見つかる可能性があります。考えるべきいくつかの実装アイデアを持つビットのストリーム。
x86 では、アクセスできる最小単位はバイトです。ただし、一度に 4 バイトにアクセスして、1 バイトではなく一度に 4 バイトで作業することができます。より高速にするには、pslldq ( SSE2 )を使用できます。もちろん、最大限のパフォーマンスを得るために、コピーが整列されていることを確認してください。
これは私がコーディングして使い始めたソリューションです。
void RightShiftMemCopy(uchar * pSource, uchar * pDest ,ushort len,uchar shiftOffset)
{
ushort i=0;
pDest+=(len-1);
pSource+=(len-1);
for(i=len-1;i != 0 ;--i)
{
*pDest = (*(pSource - 1) << 8 | *pSource) >> shiftOffset;
--pDest;
--pSource;
}
*pDest = *pSource >> shiftOffset;
}