何らかの理由で算術計算がメモリ アクセスより速い場合は、ルックアップ テーブルよりも速くなる可能性があります。これは、計算がベクトル化されている場合 (PPC AltiVec または Intel SSE)、および/またはプログラムの他の部分がキャッシュ メモリのすべてのビットを使用する必要がある場合に可能です。
拡張係数 = 3 の場合、必要な命令は 7 つだけです。
out = (((in * 0x101 & 0x0F00F) * 0x11 & 0x0C30C3) * 5 & 0x249249) * 7;
または、10 個の命令を使用する他の代替手段:
out = (in | in << 8) & 0x0F00F;
out = (out | out << 4) & 0x0C30C3;
out = (out | out << 2) & 0x249249;
out *= 7;
その他の拡張係数 >= 3 の場合:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = out * ((1 << shift) + 1) & mask;
}
out *= (1 << N) - 1;
または、拡張係数 >= 2 の場合:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = (out | out << shift) & mask;
}
out *= (1 << N) - 1;
shift
およびmask
値は、ビット ストリーム処理の前に計算することをお勧めします。