PARI/GP 中的比特数
bitcount in 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的位置吗?
要获取最高位,只需使用'logint(n, 2)'。如果你想要 lsb 使用 'valuation(n, 2)'.
还有一个内置函数 'hammingweight' 可以为您提供 1 的位数。
有没有办法得到最高位的位置,即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的位置吗?
要获取最高位,只需使用'logint(n, 2)'。如果你想要 lsb 使用 'valuation(n, 2)'.
还有一个内置函数 'hammingweight' 可以为您提供 1 的位数。