本文探讨JavaScript中计算二进制数1个数的两种方法:传统for循环与利用split方法的简洁写法。虽然正则split写法代码简短,但存在性能较低及Chrome/Opera等浏览器下结果偏移的问题。最终推荐直接使用字符"1"作为分隔符的split方式,该方法兼顾执行效率与多浏览器兼容性。
基于for循环的二进制1计数实现
代码示例如下:
代码示例如下:
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;
} 正则表达式split方法的尝试与缺陷
上述实现较为繁琐,尝试利用js的split方法结合正则\0*\来统计1的数量。代码示例如下:
代码示例如下:
function f(n){
return n.toString(2).split(/0*/).length;
} 此写法更为简洁。
经测试,正则split方法的执行效率较低,耗时约为for循环方法的2.5倍。
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
原代码存在两处错误。
IE浏览器环境下,字符串不支持通过数组下标访问字符,必须使用charAt(index)方法。
Chrome和Opera浏览器中,使用split(\0*\)统计结果在特定情形下会多出1个。
例如:12的二进制为1100,split(\0*\)生成的数组为[1,1,]。若二进制不以1结尾,数组末尾会多出一个空项(IE和Firefox无此问题)。
优化方案:直接以字符1为分隔符
无需使用正则,将"1"作为split参数,以1为分隔符,所得数组长度减1即为1的个数。
代码示例如下:
function f(n){
return n.toString(2).split("1").length – 1;
} 该方法无需正则,兼容主流浏览器,且效率不低于for循环遍历。
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]