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

3
抱歉如果这听起来有点“新手”的话,但我不知道c ++,当我看一些关于perlin噪声的代码时,尝试弄清楚它是什么时,我遇到了
& 0x7fffffff

(n << 13) ^ n;
我不知道那些意味着什么。我确实知道0x7fffffff是十六进制,但我不知道 & 是什么意思。任何帮助?

这被称为位操作。它就像普通算术运算一样,只不过这些运算符直接涉及到位。 - Marlon
5个回答

7
第一个表达式是一个掩码。它基本上清除了数字的最高位,或者等效地将数字模2^31。
第二个表达式是一次移位操作,然后是一次异或运算。在算术运算中,它与将n乘以2^13相同,然后翻转移位版本和自身之间共同的所有位。这个表达式在Perlin噪声代码中的作用是计算x、y坐标的过程空间哈希,以便它们可以用于生成噪声。
在许多程序内容中都使用了这种技术,以创建动态变化的伪随机数发生器,在空间上确定性地变化。这些哈希基本上被认为是复杂的、难以预测的、几乎是随机函数,并且通常是通过理论、猜测和实验混合发现的。因此,我不建议太过纠结于为什么在这种情况下要使用特定的公式。

那么像这样 n=n*2^13; t=(longnumbers)/2^31; - SDuke
@user677756:不完全正确。第一个表达式应该是t =(长数字)%pow(2,31)。第二个表达式应该是n =(n * pow(2,13))+ n-(添加时所有进位的位)。 - Mikola
好的,这样更有意义了,但最后一个问题,什么是比特位,如何找到在加法中被进位的那些位?(我不懂C语言,只会Lua、PHP和HTML,抱歉) - SDuke
@user677756:维基百科是你的好朋友:http://en.wikipedia.org/wiki/Bitwise_operation - Mikola

4

&是C++中的位运算与操作符

位运算与操作符(&)将第一个运算数的每一位都与第二个运算数的对应位进行比较。如果两者的位都为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 进行异或操作。


但如果它是某个数字 AND 0x7fffffff,那么它不会始终返回0x7fffffff吗?感谢您解释<<。 - SDuke
好的,现在让我们把0x7fffffff缩短为0x7f。所以假设你正在执行151 AND 0x7f - 在二进制中,这是10010111 AND 01111111。通过取两个操作数中都为1的所有位,结果是00010111。它做了什么?它MASKED OUT了第一位。你的答案是去掉第一位的151。答案是23。 - Joseph Mansfield

0

& 是按位与运算符。所以 & 0x7fffffff 可以从一个32位整数中去掉有符号位。这意味着它将 int 的最左边的位变为零。

在第二个例子中,首先使用左移操作符 <<n 左移13位,然后将此表达式的结果与 n 本身进行异或运算。


0
符号&<<^被称为运算符。有一个维基百科页面列出了C/C++运算符,所以你可以学习这些运算符的名称,然后搜索谷歌获取更多信息。 0x7fffffff是用十六进制(基数16)表示的整数。前缀0x表示它是十六进制的。 n可能是在引用行上面定义的整数变量的名称。
括号用于将表达式分组在一起,因此在您的示例中,它们保证n在进行XOR运算之前向左移动13位。如果没有括号,则操作顺序将由运算符优先级确定(在您的示例中恰好给出相同的结果)。

0

& 0x7fffffff 的含义是将(假定为)32位整数的第31位设置为零,保持第0到30位的值不变;也就是说,将32位整数设为正数;换句话说,取整数的绝对值。

(n << 13) ^ n; 的含义是先将 n 左移13位,然后用左移后的值异或原始的 n 值。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接