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 个算术指令。所以我希望也许有一种有效的算法可以准确地找到我需要的东西。