代码中的&符号,它有什么作用

Sha*_*ame -5 c++ perlin-noise

我在网上找到了我想了解的这段代码。但是,谷歌搜索没有发现以下代码中&符号的含义的任何结果

return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); 
Run Code Online (Sandbox Code Playgroud)

我从以下页面得到它:http : //freespace.virgin.net/hugo.elias/models/m_perlin.htm

是的,有人指出它不是真正的柏林,但我不在乎,我现在想知道基础知识。

你好

Chr*_*Lec 7

&符号是按位与。这意味着您是在位级别进行比较。对于每个位,结果位为 1 当且仅当 2 个传入位为 1。

1 & 2 = 0
Run Code Online (Sandbox Code Playgroud)

因为 :

1 = 00000001

2 = 00000010

2 & 3 = 2
Run Code Online (Sandbox Code Playgroud)

因为我们有:

2 = 000000 1 0

3 = 000000 1 1

结果 = 000000 1 0

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

7fffffff = (0111) (1111) (1111) etc...
Run Code Online (Sandbox Code Playgroud)

因此,无论您用什么“AND”它,结果都将以 0 开头,然后保持不变。

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

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

  • 当然,“将第一位设置为 0”仅在您应用该操作的值具有 32 位时才成立。一般来说,操作可以描述为“将最后31位以外的所有都设置为0” (2认同)