JavaScript: битовое смещение длинного длинного числа - PullRequest
16 голосов
/ 03 декабря 2008

Мне нужно поразрядно сдвинуть значение 64 раза в JavaScript. Но JavaScript начинает округляться после 32.

Например:

for(var j = 0; j < 64; j++)
{
    mask = mask << 1;
    console.log(mask);
}

Это печатает значение от 0 до 1073741824, но затем округляет и начинает печатать 0.

Ответы [ 2 ]

31 голосов
/ 03 декабря 2008

"В Java побитовые операторы работают с целыми числами. JavaScript не имеет целых чисел. Он имеет только числа с плавающей запятой двойной точности. Таким образом, побитовые операторы преобразуют свои числовые операнды в целые числа, выполняют свою работу, а затем преобразуют их обратно. В большинстве языков эти операторы очень близки к аппаратному обеспечению и очень быстры. В JavaScript они очень далеки от аппаратного и очень медленны. JavaScript редко используется для выполнения битовых манипуляций ». - Дуглас Крокфорд, Javascript: The Good Parts

Дело в том, что у вас нет никакой причины использовать побитовые операторы. Просто умножьте или разделите на 2 ^ numbits.

Ваш код должен быть:

for(var j = 0; j < 64; j++) {
 mask = mask * 2;
 console.log(mask);
}

Или вообще:

function lshift(num, bits) {
    return num * Math.pow(2,bits);
}

Вы поняли идею.

8 голосов
/ 03 декабря 2008

JavaScript сохраняет все свои числа как 64-битные изначально, но как только вы начинаете использовать побитовые операторы, интерпретатор преобразует число в 32-битное представление.

Битовые операторы в JS немного дурацкие, и поэтому досадно, что вам, вероятно, придется делать что-то более умное, например, писать свои собственные 64-битные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...