很抱歉,如果这听起来有点'noobish',但我不知道c ++,我正在查看一些代码用于perlin噪音,试图在我遇到时弄明白
& 0x7fffffff
和
(n << 13) ^ n;
我不知道那是什么意思。我知道0x7fffffff
是十六进制的,但我不知道&
意味着什么任何帮助?
答案 0 :(得分:7)
第一个表达式是位掩码。它基本上清除了数字的高位,或等效地计算了数字的mod超过2 ^ 31。
第二个表达式是一个转换,后跟一个xor。在算术中,将n乘以2 ^ 13,然后翻转移位版本与其自身之间共同的所有位将是相同的。它在perlin噪声代码中的用途是计算x,y坐标的程序空间散列,以便它们可用于为噪声发生器设定种子。
在许多程序内容中使用了这种相同类型的技术来创建动态变化的伪随机数生成器,这些生成器在空间上确定性地变化。这些哈希基本上是复杂的,难以预测的,几乎是随机的功能,通常是在理论,猜测工作和实验的混合中发现的。因此,我不建议在这种情况下过分考虑为什么使用该特定公式。
答案 1 :(得分:4)
&
在C ++中是一个明智的AND运算符
按位AND运算符(&amp;)将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位均为1,则相应的结果位设置为1.否则,相应的结果位将设置为0.
11111111 11110000
& 00000000 01100011
_________________
00000000 01100000
<<
是C ++中的位左移位运算符
&lt;&lt;运算符将其第一个操作数左移第二个操作数给出的位数,在右侧填入新的0位。
0 1 0 1 0 1 1 0 << 2
_____________________
0 1 0 1 0 1 1 0 0 0
^
是C ++中的Ex-Or运算符
bitwise-exclusive-OR运算符将其第一个操作数的每个位与其第二个操作数的相应位进行比较。如果一位为0而另一位为1,则相应的结果位设置为1.否则,相应的结果位设置为0.
0 1 0 1 0 1 1 0
^ 0 0 1 1 0 0 1 0
___________________
0 1 1 0 0 1 0 0
因此,& 0x7fffffff
将32位整数的第31位设置为零,并将其他位保留为具有的值。
(n << 13) ^ n
n
左移13
,结果与n
进行异或。
答案 2 :(得分:0)
&
是按位AND运算符。所以& 0x7fffffff
从32位整数中剥离出有符号位。这意味着,它使int
的最左边的位为零。
在第二个中,第一个n
使用<<
运算符(左移运算符)左移13,并且此表达式的结果在{{1}的XOR运算中使用本身。
答案 3 :(得分:0)
符号&
,<<
和^
称为运算符。维基百科页面列出了C/C++ operators,因此您可以了解这些运营商的名称,然后搜索Google以获取更多信息。
0x7fffffff
是以十六进制(基数为16)表示的整数。 0x
前缀表示它是十六进制。
n
可能是一个整数变量的名称,它定义在你引用的行之上几行。
括号用于将表达式组合在一起,因此在您的示例中,它们保证n在与n进行XOR运算之前向左移位13位。没有括号,操作的顺序将由operator precedence确定(在您的示例中恰好产生相同的结果)。
答案 4 :(得分:0)
& 0x7fffffff
表示将(假定的)32位整数的第31位设置为零,保留位0到30的值; IOW,使32位整数为正; IOW,取整数的绝对值。
(n << 13) ^ n;
表示将n
向左移位13位,然后xor使用原始值n
移位值。
HTH