Что в действительности делает 0x100000000 >>> 0 в Javascript при добавлении в Uint32Array - PullRequest
0 голосов
/ 26 июня 2019

Я недавно задал свой первый вопрос о переполнении стека (см.) Для цикла внутри другого для сбоев цикла в Javascript и мне дали прекрасный ответ, который, кажется, работает (спасибо Ry-), однако я изучал код, чтобы выяснить, почему / как он работает, и меня смущает следующее утверждение «0x100000000 >>> 0»

Мое понимание (как выяснилось несколько дней назад) состояло в том, что битовый символ >>> сдвигается вправо, толкая нули слева, и самые правые биты падают. Следовательно, ">>> 0" не повлияет на уравнение?

Однако, когда я удаляю побитовый код, код не работает? Может кто-нибудь объяснить, почему?

const world = document.getElementById('canvas');
const context = world.getContext('2d');

const start = performance.now();

const {width, height} = world;
const random32 = new Uint32Array(width * height);

for (let i = 0; i < random32.length; i++) {

    //THIS IS THE LINE I AM CONFUSED ABOUT
    random32[i] = Math.random() * 0x100000000 >>> 0;

}

Я попытался удалить ">>> 0", но без него код не работает.

Я пытался узнать больше о побитовых символах и массивах Uint32, но не нашел ничего, что могло бы это объяснить.

1 Ответ

0 голосов
/ 26 июня 2019

JavaScript не различает числа с плавающей точкой и целые числа. Однако некоторые операции делают. >>> - это такая операция. Math.random() * 0x100000000 будет с плавающей точкой между 0 и 0x100000000. Однако >>> приводит к положительному целому числу, поскольку >>> работает только с целыми числами. Затем оно сдвигает это целое число на 0 цифр, что действительно ничего не делает.

tl; dr: x >>> 0 на неотрицательных числах совпадает с x|0 и Math.floor(x).

...