我正在尝试编写一个函数以返回小于(2 ^ 53)-1的Javascript限制的正整数的位数。但是,我受到精度问题的困扰,并希望避免使用大型整数库。
方法1:
function bitSize(num)
{
return Math.floor( Math.log(num) / Math.log(2) ) + 1;
}
Pass: bitSize( Math.pow(2, 16) -1 ) = 16
Pass: bitSize( Math.pow(2, 16) ) = 17
Fail (Should be 48): bitSize( Math.pow(2, 48) -1 ) = 49
Pass: bitSize( Math.pow(2, 48) ) = 49
方法2:
function bitSize(num)
{
var count = 0;
while(num > 0)
{
num = num >> 1;
count++;
}
return count;
}
Pass: bitSize( Math.pow(2, 16) -1 ) = 16
Pass: bitSize( Math.pow(2, 16) ) = 17
Fail (Should be 48): bitSize( Math.pow(2, 48) -1 ) = 1
Fail (Should be 49): bitSize( Math.pow(2, 48) ) = 1
我认为这两种方法都无法解决问题。
谁能建议一种适用于0-> 2 ^ 53-1之间数字的替代方法
谢谢。
最佳答案
你可以做:
function bitSize(num) {
return num.toString(2).length;
}
toString()
的 Number
方法将基数作为可选参数。这是一些tests。适用于Chrome,Safari,Opera和Firefox。无法访问IE,对不起。