快速判断整数的位数

编程中,我们有时需要判断一个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类,感兴趣的同学可以自行查看。

推荐阅读更多精彩内容