Я сталкивался с этой функцией:
const LIMIT32 = 2147483648; // The limit at which a 32-bit number switches signs == 2 ^ 31
function long(v) {
// Two's complement
if (v >= LIMIT32) {
v = -(2 * LIMIT32 - v);
}
return [(v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF];
}
// e.g.
[-3, -2, -1, 0, 1,
-2147483649,-2147483648,-2147483647,
2147483647,2147483648,2147483649].forEach(x =>
console.log(`${x}: ${long(x)}`)
);
Мне вообще интересно, что делает эта функция (почему она возвращает массив и каковы элементы массива).
Тогда мне интересно, почему он берет v
и выполняет то, что выглядит как переворот знака и некоторое умножение.
Наконец, значение операций bithift и &
для каждого элемента, почему оно кратно 8, и почему они выбрали 0xFF
.