Значение этой «длинной» функции (дополнение к двум и сдвиг битов) - PullRequest
0 голосов
/ 16 января 2019

Я сталкивался с этой функцией:

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.

1 Ответ

0 голосов
/ 16 января 2019

Мне вообще интересно, что делает эта функция (почему она возвращает массив и каковы элементы массива).

Возвращает массив из 4 байтов, составляющих значение int32. Почему кто-то написал код для этого? Я не знаю.

Тогда мне интересно, почему он принимает v и делает то, что выглядит как переворот знака и некоторое умножение.

Потому что так работает int32: 0x7FFFFFFF + 1 === -0x80000000.

Хотя в этом коде нет необходимости, битовые операции позаботятся обо всем.

Наконец, значение битового сдвига и операций & для каждого элемента, почему оно кратно 8, и почему они выбрали 0xFF.

Получение различных байтов int32, каждый длиной 8 бит.

...