len
タイプの要素の配列が与えられると、配列signed short
内の最大絶対値要素に設定された最上位ビットの位置を見つけることになります。たとえば、配列 L が含まれている場合は{-134, 123, 0, -890}
、f(L)
を返す必要がありfloor(log2(abs(-890)))+1
ます。
これが私の現在の機能です:
short MSBSetMaxMagnitude(const short *p, int len)
{
unsigned int t = 0;
while (len > 0)
{
t |= abs(*p);
p++;
len--;
}
if(t)
return (short)(32 - __builtin_clz(t));
else
return 0;
}
ただし、 abs() 関数が分岐を必要とするため、少し遅くなります。代わりに分岐せずに abs() を使用しようとしましたが、少なくとも 3 つの算術命令が含まれているため、さらに遅くなります。ですから、必要なものを正確に見つけるための効率的なアルゴリズムがあることを願っています。