Я нашел этот код в Интернете, который я хотел бы понять. Однако поиск в Google не дал никаких результатов относительно значения амперсанда в следующем коде.
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
Я получил это со следующей страницы: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
и да, было отмечено, что это не настоящий перлин, но мне все равно, я хочу знать основы на данный момент.
Привет
Амперсанд является побитовым И. Это означает, что вы сравниваете на уровне битов.
Для каждого бита результирующий бит равен 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 означает, что оно положительное.
&
побитовый and
оператор.
0 & 0 == 0
1 & 0 == 0
0 & 1 == 0
1 & 1 == 1