c ++数学/十六进制问题

| 抱歉,这听起来有点“没意思”,但我不知道c ++,我在寻找一些有关Perlin噪声的代码,试图在遇到时找出来
& 0x7fffffff
(n << 13) ^ n;
我不知道那是什么意思。我确实知道
0x7fffffff
是十六进制,但是我不知道
&
是什么意思吗?     
已邀请:
        第一个表达式是位掩码。它基本上清除了数字的高位,或者等效地计算了2到31之间的数字的mod。 第二个表达式是移位,后跟一个xor。在算术中,这与将n乘以2 ^ 13,然后翻转移位版本及其本身之间的所有公共位相同。在perlin噪声代码中,其目的是计算x,y坐标的过程空间哈希,以便可以将它们用作种子噪声生成器。 许多程序内容中都使用了这种相同类型的技术,以创建在空间上确定性变化的动态变化的伪随机数生成器。这些哈希基本上意味着复杂,难以预测,几乎是随机的函数,通常是在理论,猜测工作和实验的混合中发现的。因此,在这种情况下,我不建议您为它为什么使用该特定公式进行认真思考。     
        
&
是C ++中的位AND运算符 按位与运算符(&)将第一个操作数的每个位与第二个操作数的对应位进行比较。如果两个位都为1,则将相应的结果位设置为1。否则,将相应的结果位设置为0。
     11111111 11110000  
   & 00000000 01100011
     _________________
     00000000 01100000
<<
是C ++中的按位左移运算符 <<运算符将其第一个操作数向左移动其第二个操作数给定的位数,并在右侧填充新的0位。
    0 1 0 1 0 1 1 0 << 2
    _____________________
    0 1 0 1 0 1 1 0 0 0
^
是C ++中的异或运算符 按位异或运算符将其第一个操作数的每个位与第二个操作数的对应位进行比较。如果一位为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
进行异或。     
        
&
是按位与运算符。因此,“ 0”会从32位整数中去除带符号的位。就是说,它使
int
的最左位为零。 在第二个运算中,第一个
n
使用作为左移运算符的left6ѭ运算符与13左移,并且该表达式的结果与
n
本身一起用于XOR运算。     
        “ 0”表示将(假定的)32位整数的第31位设置为零,并保留0至30位的值; IOW,使32位整数为正; IOW,取整数的绝对值。 “ 1”表示将“ 12”左移13位,然后将移位后的值与原始值“ 12”进行异或。 高温超导     
        符号
&
<<
^
称为运算符。 Wikipedia页面上列出了C / C ++运算符,因此您可以了解这些运算符的名称,然后搜索Google以获取更多信息。
0x7fffffff
是用十六进制(基数16)表示的整数。
0x
前缀表示它是十六进制。
n
可能是整数变量的名称,该变量定义在所引用的行上方几行。 括号用于将表达式分组在一起,因此在您的示例中,它们保证n在与n进行XOR运算之前向左移13位。如果没有括号,则运算顺序将由运算符优先级确定(在您的示例中,该运算符会给出相同的结果)。     

要回复问题请先登录注册