【问题标题】:ampersand in code, what does it do [closed]代码中的&符号,它有什么作用[关闭]
【发布时间】:2013-06-28 08:30:46
【问题描述】:

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

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

我是从以下页面获得的:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

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

问候

【问题讨论】:

  • 在这种情况下怎么办?
  • 那是 C/C++ 语言基础知识,您应该阅读您选择的教科书中按位运算的作用。像 SO 这样的问答网站不可能足够详细地涵盖这些基本主题。
  • 我不是在用 C++ 编程,这就是重点。我只是不明白这一行。

标签: c++ perlin-noise


【解决方案1】:

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

1 & 2 = 0

因为:

1 = 00000001

2 = 00000010

但是

2 & 3 = 2

因为我们有:

2 = 000000 1 0

3 = 000000 1 1

结果 = 000000 1 0

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

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

所以无论你用什么“与”它,结果都会以 0 开头,然后保持不变。

鉴于结果是有符号整数,将第一位置0的作用是保证结果始终为正。

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

【讨论】:

  • 当然,“将第一位设置为 0”仅在您应用该操作的值具有 32 位时才成立。一般来说,该操作可以描述为“将除最后31位之外的所有位设置为0”
【解决方案2】:

& 是按位 and 运算符。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多