编程中,我们有时需要判断一个int类型整数的位数。方法很简单,只要循环除以10,直到商为0,循环了几次位数就是几。
不过,这或许不是效率最高的方案,因为除法运算很慢。能不能不做运算就判断出位数呢?
看下面这段神奇的代码:
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
// Requires positive x
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
调用stringSize
方法,就可以计算出x
的位数(x必须为正数)。该方法内部做了若干次比较操作,与事先定义的sizeTable
比较,找到第一个比x
大的数,返回对应的下标加1即可。
因为int类型的整数位数不会超过10,因此定义sizeTable
并不麻烦。即使想要计算long类型整数的位数,仍然可以用这种方法,只需要把sizeTable
的长度增加一倍即可。
在我电脑上测试时,1亿次计算,这种方法比除以10的方法快5倍。
(速度差距没想象中大orz)
最后,告诉大家一个秘密,这段代码来自于Java源码中的Integer类,感兴趣的同学可以自行查看。