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ù)。
代碼如下:
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。代碼如下:
function f(n){
return n.toString(2).split(/0*/).length;
}
這樣代碼就顯得很簡(jiǎn)潔了。
只可惜測(cè)試了下兩種方法的效率,發(fā)現(xiàn)利用正則的split方法效率比較低,時(shí)間大概是for循環(huán)方法的2.5倍。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
發(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。
function f(n){
return n.toString(2).split("1").length – 1;
}
這樣就不用采用正則的方法,也兼容了各主流瀏覽器,而且它的效率完全不低于使用for遍歷的方法。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
復(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倍。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
發(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遍歷的方法。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
相關(guān)文章
javaScript 連接打印機(jī),打印小票的實(shí)例
下面小編就為大家分享一篇javaScript 鏈接打印機(jī),打印小票的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
利用js+css+html實(shí)現(xiàn)固定table的列頭不動(dòng)
本文分享了利用js+css+html實(shí)現(xiàn)固定table的列頭不動(dòng)的實(shí)例代碼。小編認(rèn)為具有很好的參考價(jià)值,感興趣的朋友可以看下2016-12-12
js實(shí)現(xiàn)列表自動(dòng)滾動(dòng)循環(huán)播放
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)列表自動(dòng)滾動(dòng)循環(huán)播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
微信小程序?qū)W習(xí)總結(jié)(一)項(xiàng)目創(chuàng)建與目錄結(jié)構(gòu)分析
這篇文章主要介紹了微信小程序?qū)W習(xí)總結(jié)(一)項(xiàng)目創(chuàng)建與目錄結(jié)構(gòu),總結(jié)分析了微信小程序項(xiàng)目創(chuàng)建、配置方法以及目錄結(jié)構(gòu)、文件功能,需要的朋友可以參考下2020-06-06
JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式區(qū)別淺析
這篇文章主要介紹了JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式區(qū)別淺析,本文總結(jié)的淺顯易懂,非常好的一篇技術(shù)文章,需要的朋友可以參考下2015-03-03
document.getElementById方法在Firefox與IE中的區(qū)別
相信很多朋友在寫(xiě)JavaScript的時(shí)候,對(duì)瀏覽器的兼容問(wèn)題會(huì)感到很頭疼。這不,煩什么,什么就來(lái)了,特記錄下來(lái),與大家分享。2010-05-05

