PARI / GP中的位数

时间:2019-11-26 16:16:24

标签: pari pari-gp

是否有一种方法来获取最高有效位的位置,即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的位置吗?

1 个答案:

答案 0 :(得分:1)

要获取msb,只需使用'logint(n,2)'。如果要使用lsb,请使用'valuation(n,2)'。

还有一个内置函数“ hammingweight”,可以为您提供1位的数字。