Jas*_*ner 9 javascript bits bit-manipulation
我正在尝试编写一个函数来返回一个正整数的位数,小于(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
Run Code Online (Sandbox Code Playgroud)
方法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
Run Code Online (Sandbox Code Playgroud)
我认为这两种方法都不能解决精确问题.
任何人都可以建议一种替代方法,适用于0 - > 2 ^ 53-1之间的数字
谢谢.
fma*_*ark 10
按位运算只能在Javascript中可靠地工作,最多可达32位的"整数". 引用完整的JavaScript编号参考:
按位操作在Javascript中有点破解.由于Javascript中的所有数字都是浮点数,并且按位运算符仅适用于整数,因此Javascript会在幕后魔术中使用,以使其显示按位运算应用于32位有符号整数.
具体来说,Javascript获取您正在处理的数字并获取该数字的整数部分.然后,它将整数转换为数字所代表的最大位数,最多31位(符号为1位).因此0将创建一个两位数(符号为1,0为1位),同样1将创建两位.2将创建一个3位数字,4将创建一个4位数字等...
重要的是要意识到你不能保证一个32位的数字,例如,运行不是零,理论上应该将0转换为4,294,967,295,而它将返回-1有两个原因,第一个是所有数字都是用Javascript签名的所以"不"总是反转符号,第二个Javascript不能从数字零开始超过一位而不是零变为一.因此~0 = -1.
所以Javascript中的按位符号最多为32位.
正如Anurag所说,你应该简单地num.toString(2)在这种情况下使用内置函数,它输出一个ASCII '1's和'0's 的最小长度字符串,你可以简单地取长度.
你可以做:
function bitSize(num) {
return num.toString(2).length;
}
Run Code Online (Sandbox Code Playgroud)
所述toString()的方法Number取的基数作为可选参数.
这是一些测试.适用于Chrome,Safari,Opera和Firefox.没有访问IE,抱歉.