Может кто-нибудь перевести эту простую функцию в Javascript? - PullRequest
0 голосов
/ 02 февраля 2012

Я читаю учебник по Perlin Noise , и я наткнулся на эту функцию:

function IntNoise(32-bit integer: x)             

    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    

end IntNoise function

Хотя я понимаю некоторые ее части, я действительно не понимаючто должны означать (x<<13) и & 7fffffff (я вижу, что это шестнадцатеричное число, но что оно делает?).Может кто-нибудь помочь мне перевести это на JS?Кроме того, обычные целые числа в JS 32-разрядные, на 32-разрядных компьютерах, верно?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

x<<13 означает сдвиг на 13 шагов влево (по битам). Кроме того, a<<b эквивалентно a*2^b.

& 7ffffff означает побитовое И левой стороны с 7FFFFFFF. Если вы посмотрите на битовую комбинацию 7FFFFFFF, вы заметите, что бит 32 равен 0, а остальные биты равны 1. Это означает, что вы замаскируете бит 0-30 и сбросите бит 31.

3 голосов
/ 02 февраля 2012

Должно работать в JavaScript с минимальными изменениями:

function IntNoise(x) {
    x = (x << 13) ^ x;
    return (1 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824);
}

Оператор << является битовым сдвигом влево, поэтому << 13 означает смещение числа 13 битов влево.

Оператор & является побитовым AND. Выполнение & 0x7fffffff для 32-разрядного целого числа со знаком маскирует бит знака, гарантируя, что результатом всегда будет положительное число (или ноль).

То, как JavaScript работает с числами, по меньшей мере, немного странно. Все числа обычно представлены как IEEE-754 удваивается , но ... как только вы начнете использовать побитовые операторы для числа, JavaScript будет обрабатывать операнды как 32-битные целые числа со знаком в течение всего времени вычисления.

Вот хорошее объяснение того, как JavaScript работает с побитовыми операциями:

...