編程中,我們有時(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é)可以自行查看。