我正在尝试编写一个函数以返回小于(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,对不起。

10-02 18:45