我有一个BigInteger
的集合,我正在尝试获取每个整数的位数。为简洁起见,我们假设我们只处理正数字。我们正在查看超过1000位的数字。
以下是我想到的方法。
字符串表示的长度(需要一堆内存)
模10方法(慢)
一个asanine想法(为了彻底而包括在内,因为这种方法的可扩展性不是很好)
if (i >= 100000000) {
i /= 100000000;
n += 8;
}
if (i >= 10000) {
i /= 10000;
n += 4;
}
if (i >= 100) {
i /= 100;
n += 2;
}
if (i >= 10) {
i /= 10;
n += 1;
}
对数(我觉得相当友好)(积分转到[this answer])
int blex = val.bitLength() - 1022; // any value in 60..1023 is ok
if (blex > 0)
val = val.shiftRight(blex);
double res = Math.log10(val.doubleValue());
return blex > 0 ? res + blex * LOG2 : res;
这是我的想法,但想要测试编码前的有效性;说我有一些号码x
。尝试使用(传统或单侧)二进制搜索的概念除以10的幂,并在0 < quotient < 10
时停止。 power + 1
应为数字位数。这将是一个对数解(?)。
StackOverflow似乎没有什么可以用来计算任意数字中的位数。这个accepted answer表明了一种分区繁重的方法,可能会导致创建一堆新对象。我想知道是否可以有一个更光滑的解决方案。所以,我认为这篇文章将导致富有成效的讨论和思想的合作。请建议哪种方法最适合真正的大数字。