JavaScript 特有方法計算二進制中1的個數(shù) split方法
更新時間:2010年05月06日 11:40:33 作者:
這是一道網上看到的前端的筆試題,主要思想是利用JavaScript的toString方法將十進制數(shù)轉換為二進制的字符串。然后for循環(huán)遍歷計算字符串中”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;
}
覺得這樣寫很麻煩,突然想到是不是可以利用js的split方法來實現(xiàn)計算1的個數(shù),split的參數(shù)為正則\0*\,分離字符串中的1。代碼如下:
function f(n){
return n.toString(2).split(/0*/).length;
}
這樣代碼就顯得很簡潔了。
只可惜測試了下兩種方法的效率,發(fā)現(xiàn)利用正則的split方法效率比較低,時間大概是for循環(huán)方法的2.5倍。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
發(fā)現(xiàn)原來的代碼中有兩個錯誤。
一是在IE下,字符串不能使用數(shù)組下標訪問指定位置的值,只能采用charAt(index)的方法。
二是在Chrome和Opera下,split(\0*\)的方式計算出的1的個數(shù)在有些情況下會多1。
比如:12的二進制值為1100,使用split(\0*\)的方式生成的數(shù)組為[1,1,]。也就是說,當二進制值不以1結尾時,在最后都會生成一個空數(shù)組項(在IE和Firefox中沒有這個問題)。
思考后發(fā)現(xiàn),其實并不需要使用正則的方式來計算1的個數(shù),只要把1當做split方法的參數(shù),把1作為分隔符,分出的數(shù)組的長度應該是1的個數(shù)加1。
function f(n){
return n.toString(2).split("1").length – 1;
}
這樣就不用采用正則的方法,也兼容了各主流瀏覽器,而且它的效率完全不低于使用for遍歷的方法。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
復制代碼 代碼如下:
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;
}
覺得這樣寫很麻煩,突然想到是不是可以利用js的split方法來實現(xiàn)計算1的個數(shù),split的參數(shù)為正則\0*\,分離字符串中的1。代碼如下:
復制代碼 代碼如下:
function f(n){
return n.toString(2).split(/0*/).length;
}
這樣代碼就顯得很簡潔了。
只可惜測試了下兩種方法的效率,發(fā)現(xiàn)利用正則的split方法效率比較低,時間大概是for循環(huán)方法的2.5倍。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
發(fā)現(xiàn)原來的代碼中有兩個錯誤。
一是在IE下,字符串不能使用數(shù)組下標訪問指定位置的值,只能采用charAt(index)的方法。
二是在Chrome和Opera下,split(\0*\)的方式計算出的1的個數(shù)在有些情況下會多1。
比如:12的二進制值為1100,使用split(\0*\)的方式生成的數(shù)組為[1,1,]。也就是說,當二進制值不以1結尾時,在最后都會生成一個空數(shù)組項(在IE和Firefox中沒有這個問題)。
思考后發(fā)現(xiàn),其實并不需要使用正則的方式來計算1的個數(shù),只要把1當做split方法的參數(shù),把1作為分隔符,分出的數(shù)組的長度應該是1的個數(shù)加1。
復制代碼 代碼如下:
function f(n){
return n.toString(2).split("1").length – 1;
}
這樣就不用采用正則的方法,也兼容了各主流瀏覽器,而且它的效率完全不低于使用for遍歷的方法。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
相關文章
js switch case default 的用法示例介紹
switch case default的用法應該存在一部分人不會使用吧,其實很簡單就是每個case后,一定要加:break;default,就相當于else,不會的朋友可以了解下2013-10-10