C++ 在代码中,它是做什么的

C++ 在代码中,它是做什么的,c++,perlin-noise,C++,Perlin Noise,我在网上找到了我想理解的代码。然而,谷歌并没有在下面的代码中找到任何关于符号含义的结果 return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); 我是从下一页得到的: 是的,有人指出它不是真正的柏林,但我不在乎,我现在想知道基本情况 问候语&是按位和运算符 0 & 0 == 0 1 & 0 == 0 0 & 1 == 0 1 & 1

我在网上找到了我想理解的代码。然而,谷歌并没有在下面的代码中找到任何关于符号含义的结果

return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); 
我是从下一页得到的:

是的,有人指出它不是真正的柏林,但我不在乎,我现在想知道基本情况


问候语

&
是按位
运算符

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

符号AND是位AND。这意味着你在比特级别上进行比较。 对于每个位,当且仅当2个输入位为1时,结果位为1

1 & 2 = 0
因为:

1=00000001

2=00000010

但是

因为我们有:

2=00000010

3=00000011

结果=00000010

在您的示例中,按位AND用于强制结果的第一位为0(如果结果为32位,在您的示例中就是这种情况),因为:

7fffffff = (0111) (1111) (1111) etc...
因此,无论你用什么“和”它,结果都将以0开始,然后保持不变

假设结果是有符号整数,将第一位置为0的效果是确保结果始终为正


这是因为在cpp中,有符号整数的第一位用于设置符号。1表示数字是负数,0表示数字是正数。

在这种情况下怎么办?如果计算出(x*(x*x*15731+789221)+1376312589)并用7fffffff(十六进制)进行位和运算,这是C/C++语言的基础知识,你应该阅读你选择的教科书中的位运算。像这样的问答网站不可能足够详细地覆盖这些基本话题。我不是在C++编程,这就是重点。我只是不明白这一行。可能的重复当然“设置第一位为0”只有当您应用该操作的值有32位时才有效。通常,该操作可描述为“将除最后31位之外的所有位设置为0”
7fffffff = (0111) (1111) (1111) etc...