有没有一种方法可以获得最高有效位的位置,即floor(log(x)/log(2)) + 1
?
目前我正在运行以下可憎的事情:
bitcount(a)={
my(l2, ap, l2ap);
if(a == 0,
return(0);
);
\\ TODO: set upper limit according to current precision
if(a < 2^32,
l2 = floor(log(a)/log(2));
return(l2 + 1);
);
\\ Argument reduction
l2 = floor(log(a)/log(2)) - 2;
ap = a >> l2;
\\ Get the fine details.
l2ap = floor(log(ap)/log(2));
ap = l2 + l2ap;
return(ap + 1);
}
这是必要的,因为我正在处理更大的数字,并且floor(log(2^(2^31) - 1)/log(2)) + 1
打印正确结果2147483647
而不是错误结果所需的精度2147483648
非常大。
PARI/GP 中真的没有内置函数来获取 MSB 的位置吗?