SIMD ファミリーの命令のいずれかで以下が可能かどうかを知りたいです。
有効ビット数が 63 の qword 入力があります (決して負ではありません)。LSB から始まる一連の 7 ビットはそれぞれ、バイトにシャッフル整列され、左パディングは 1 です (ゼロ以外の最上位バイトを除く)。説明のために、わかりやすくするために文字を使用します。
結果は、バイト配列に変換される 0 から 9 のサイズの有効なバイトのみです。
In: 0|kjihgfe|dcbaZYX|WVUTSRQ|PONMLKJ|IHGFEDC|BAzyxwv|utsrqpo|nmlkjih|gfedcba
Out: 0kjihgfe|1dcbaZYX|1WVUTSRQ|1PONMLKJ|1IHGFEDC|1BAzyxwv|1utsrqpo|1nmlkjih|1gfedcba
サイズ = 9
In: 00|nmlkjih|gfedcba
Out: |0nmlkjih|1gfedcba
サイズ = 2
パディングが別であることは理解しています。シャッフル調整は私の質問です。これは可能ですか?
編集2
これが私の更新されたコードです。シングル スレッド Core 2 Duo 2 GHz、64 ビットでランダムな長さの入力に対して持続的な 46 M/秒を取得します。
private static int DecodeIS8(long j, ref byte[] result)
{
if (j <= 0)
{
return 0;
}
int size;
// neater code: gives something to break out of
while (true)
{
result[0] = (byte)((j & 0x7F) | 0x80);
size = 0;
j >>= 7;
if (j == 0) break;
result[1] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[2] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[3] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[4] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[5] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[6] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[7] = (byte)((j & 0x7F) | 0x80);
size++;
j >>= 7;
if (j == 0) break;
result[8] = (byte)j;
return 9;
}
result[size] ^= 0x80;
return size + 1;
}