амперсанд в коде, что он делает

Я нашел этот код в Интернете, который я хотел бы понять. Однако поиск в Google не дал никаких результатов относительно значения амперсанда в следующем коде.

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

Я получил это со следующей страницы: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

и да, было отмечено, что это не настоящий перлин, но мне все равно, я хочу знать основы на данный момент.

Привет

-6

Решение

Амперсанд является побитовым И. Это означает, что вы сравниваете на уровне битов.
Для каждого бита результирующий бит равен 1, если и только если 2 входящих бита равны 1.

1 & 2 = 0

Так как :

1 = 00000001

2 = 00000010

Но

2 & 3 = 2

Потому что у нас есть:

2 = 000000 1 0

3 = 000000 1 1

результат = 000000 1 0

В вашем случае побитовое И используется для принудительной установки 0 на первый бит результата (если результат в 32 битах, как в вашем примере), потому что:

7fffffff = (0111) (1111) (1111) etc...

Поэтому независимо от того, с чем вы «И», результат будет начинаться с 0, а затем будет неизменным.

Учитывая, что результатом является целое число со знаком, результат установки первого бита в 0 должен гарантировать, что результат всегда будет положительным.

Это связано с тем, что в cpp первый бит целого числа со знаком используется для установки знака. 1 означает, что число отрицательное, 0 означает, что оно положительное.

4

Другие решения

& побитовый and оператор.

0 & 0 == 0
1 & 0 == 0
0 & 1 == 0
1 & 1 == 1
1

По вопросам рекламы [email protected]