最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript 特有方法計(jì)算二進(jìn)制中1的個(gè)數(shù) split方法

 更新時(shí)間:2010年05月06日 11:40:33   作者:  
這是一道網(wǎng)上看到的前端的筆試題,主要思想是利用JavaScript的toString方法將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制的字符串。然后for循環(huán)遍歷計(jì)算字符串中”1″出現(xiàn)的次數(shù)。
代碼如下:
復(fù)制代碼 代碼如下:

function g(n){
var n = n.toString(2);
var count = 0;
for(var i=0;i<n.length;i++)
{
if(n[i] == "1")
count++;
}
return count;
}

覺(jué)得這樣寫(xiě)很麻煩,突然想到是不是可以利用js的split方法來(lái)實(shí)現(xiàn)計(jì)算1的個(gè)數(shù),split的參數(shù)為正則\0*\,分離字符串中的1。代碼如下:
復(fù)制代碼 代碼如下:

function f(n){
return n.toString(2).split(/0*/).length;
}

這樣代碼就顯得很簡(jiǎn)潔了。

只可惜測(cè)試了下兩種方法的效率,發(fā)現(xiàn)利用正則的split方法效率比較低,時(shí)間大概是for循環(huán)方法的2.5倍。

發(fā)現(xiàn)原來(lái)的代碼中有兩個(gè)錯(cuò)誤。

一是在IE下,字符串不能使用數(shù)組下標(biāo)訪(fǎng)問(wèn)指定位置的值,只能采用charAt(index)的方法。

二是在Chrome和Opera下,split(\0*\)的方式計(jì)算出的1的個(gè)數(shù)在有些情況下會(huì)多1。

比如:12的二進(jìn)制值為1100,使用split(\0*\)的方式生成的數(shù)組為[1,1,]。也就是說(shuō),當(dāng)二進(jìn)制值不以1結(jié)尾時(shí),在最后都會(huì)生成一個(gè)空數(shù)組項(xiàng)(在IE和Firefox中沒(méi)有這個(gè)問(wèn)題)。

思考后發(fā)現(xiàn),其實(shí)并不需要使用正則的方式來(lái)計(jì)算1的個(gè)數(shù),只要把1當(dāng)做split方法的參數(shù),把1作為分隔符,分出的數(shù)組的長(zhǎng)度應(yīng)該是1的個(gè)數(shù)加1。
復(fù)制代碼 代碼如下:

function f(n){
return n.toString(2).split("1").length – 1;
}

這樣就不用采用正則的方法,也兼容了各主流瀏覽器,而且它的效率完全不低于使用for遍歷的方法。

相關(guān)文章

最新評(píng)論

德昌县| 江陵县| 蒙山县| 栾城县| 高淳县| 商都县| 如皋市| 西盟| 邢台市| 肃宁县| 梁山县| 平远县| 清新县| 航空| 潜山县| 内江市| 岚皋县| 永济市| 岑巩县| 海安县| 天等县| 西充县| 普定县| 安庆市| 阳新县| 丰顺县| 鹿邑县| 万安县| 饶平县| 安宁市| 镇雄县| 来凤县| 扎囊县| 绥宁县| 邵武市| 吉林省| 涞水县| 麟游县| 壤塘县| 荣成市| 锡林郭勒盟|