JavaScript: Побитовое смещение длинного длинного номера

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

Например:

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

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

2 ответа

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

Дело в том, что у вас действительно нет причин использовать побитовые операторы. Просто умножьте или разделите на 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);
}

Вы получаете идею.


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

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

licensed under cc by-sa 3.0 with attribution.