編程中补憾,我們有時(shí)需要判斷一個(gè)int類型整數(shù)的位數(shù)。方法很簡(jiǎn)單卷员,只要循環(huán)除以10盈匾,直到商為0,循環(huán)了幾次位數(shù)就是幾毕骡。
不過(guò)削饵,這或許不是效率最高的方案,因?yàn)槌ㄟ\(yùn)算很慢未巫。能不能不做運(yùn)算就判斷出位數(shù)呢窿撬?
看下面這段神奇的代碼:
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;
}
調(diào)用stringSize
方法,就可以計(jì)算出x
的位數(shù)(x必須為正數(shù))叙凡。該方法內(nèi)部做了若干次比較操作劈伴,與事先定義的sizeTable
比較,找到第一個(gè)比x
大的數(shù)握爷,返回對(duì)應(yīng)的下標(biāo)加1即可跛璧。
因?yàn)閕nt類型的整數(shù)位數(shù)不會(huì)超過(guò)10,因此定義sizeTable
并不麻煩新啼。即使想要計(jì)算long類型整數(shù)的位數(shù)追城,仍然可以用這種方法,只需要把sizeTable
的長(zhǎng)度增加一倍即可师抄。
在我電腦上測(cè)試時(shí)漓柑,1億次計(jì)算,這種方法比除以10的方法快5倍叨吮。
(速度差距沒(méi)想象中大orz)
最后辆布,告訴大家一個(gè)秘密,這段代碼來(lái)自于Java源碼中的Integer類茶鉴,感興趣的同學(xué)可以自行查看锋玲。