如何高效的获取一个数字的首位数字

前言

一直以来都是通过转化为String的方式来获得首位数字, 但是直觉告诉我, 这个肯定不是最高效的。
在stackoverflow上找到了这篇文章。虽然看标题是C#的, 但是算法没有语言之分。同样适用于java
How can you get the first digit in an int (C#)?

解法(效率从低到高)

转化为字符串

1
int firstDigit = String.valueOf(num).charAt(0) - '0';

Result: 9,165,089 ticks

循环除10

1
2
3
while(num >= 10){
num = 10;
}

Results: 6,001,570 ticks

暴力if

因为int的取值范围有限, 所以可以使用这种暴力枚举的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int firstdigit;
if (num < 10)
firstdigit = num;
else if (num < 100)
firstdigit = num / 10;
else if (num < 1000)
firstdigit = num / 100;
else if (num < 10000)
firstdigit = num / 1000;
else if (num < 100000)
firstdigit = num / 10000;
else if (num < 1000000)
firstdigit = num / 100000;
else if (num < 10000000)
firstdigit = num / 1000000;
else if (num < 100000000)
firstdigit = num / 10000000;
else if (num < 1000000000)
firstdigit = num / 100000000;
else
firstdigit = num / 1000000000;

Results: 1,421,659 ticks

二分if

因为int的取值范围有限, 所以可以使用这种暴力枚举的方法。
对上面的暴力枚举使用二分法进行优化。

1
2
3
4
if (num >= 100000000) num /= 100000000;
if (num >= 10000) num /= 10000;
if (num >= 100) num /= 100;
if (num >= 10) num /= 10;

Results: 1,399,788 ticks

参考资料