【问题标题】:c++ math/hex questionC++ 数学/十六进制问题
【发布时间】:2011-09-22 12:14:15
【问题描述】:

对不起,如果这听起来有点“笨拙”,但我不懂 c++,我正在查看一些 perlin 噪音的代码,试图在遇到时弄清楚

& 0x7fffffff

(n << 13) ^ n;

我不知道这些是什么意思。我知道0x7fffffff 是十六进制,但我不知道& 是什么意思有什么帮助吗?

【问题讨论】:

  • 那叫bit twiddling。这就像常规的算术运算,只是这些运算符直接与位相关。

标签: c++ math hex


【解决方案1】:

符号&<<^ 称为运算符。有一个 Wikipedia 页面列出了 C/C++ operators,因此您可以了解这些运营商的名称,然后在 Google 上搜索更多信息。

0x7fffffff 是一个以十六进制(基数为 16)表示法编写的整数。 0x 前缀表示它是十六进制的。

n 可能是在您引用的行上方几行定义的整数变量的名称。

括号用于将表达式组合在一起,因此在您的示例中,它们保证 n 在与 n 进行异或之前被左移 13 位。如果没有括号,操作顺序将由operator precedence 确定(在您的示例中恰好给出相同的结果)。

【讨论】:

    【解决方案2】:

    & 在 C++ 中是一个有点明智的 AND 运算符

    按位与运算符 (&) 将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位都为1,则对应的结果位设置为1。否则,对应的结果位设置为0。

         11111111 11110000  
       & 00000000 01100011
         _________________
         00000000 01100000
    

    << 是 C++ 中的按位左移运算符

        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
    

    因此,&amp; 0x7fffffff 将 32 位整数的第 31 位设置为零,并保留其他位的值。

    (n &lt;&lt; 13) ^ n n13 左移,结果与n 异或。

    【讨论】:

    • 但如果它是某个数字和 0x7fffffff,那不是总是返回 0x7fffffff 吗?并感谢您解释
    • 好的,我们暂时将 0x7fffffff 缩短为 0x7f。因此,假设您正在执行 151 AND 0x7f - 在二进制中,这是 10010111 AND 01111111。通过取两个操作数中所有为 1 的位,结果是 00010111。它做了什么?它首先被掩盖了。你的答案是 151,去掉了第一位。答案是 23。
    【解决方案3】:

    &amp; 0x7fffffff 表示将(假定的)32 位整数的第 31 位设置为零,保留第 0 位到第 30 位的值; IOW,使32位整数为正; IOW,取整数的绝对值。

    (n &lt;&lt; 13) ^ n; 表示将n 左移13 位,然后将移位后的值与n 的原始值进行异或。

    HTH

    【讨论】:

      【解决方案4】:

      第一个表达式是位掩码。它基本上清除了数字的高位,或者等效地计算了 2^31 上的数字的 mod。

      第二个表达式是一个移位,后跟一个异或。在算术上,它与将 n 乘以 2^13 相同,然后翻转移位版本与其自身之间共有的所有位。它在 perlin 噪声代码中的目的是计算 x,y 坐标的程序空间散列,以便它们可以用来作为噪声发生器的种子。

      在许多程序内容中都使用了相同类型的技术来创建动态变化的伪随机数生成器,这些生成器在空间中确定性地变化。这些哈希基本上是复杂的、难以预测的、几乎是随机的函数,通常是通过理论、猜测和实验的混合来发现的。因此,我不建议您过分思考为什么在这种情况下使用该特定公式。

      【讨论】:

      • 那么喜欢n=n*2^13; t=(longnumbers)/2^31; ?
      • @user677756:不完全是。第一个表达式是 t = (long numbers) % pow(2, 31)。第二个表达式是 n = (n * pow(2, 13)) + n - (添加时携带的所有位)
      • 好的,这更有意义,但最后一个问题是,位到底是什么,我如何找到添加时携带的位? (我不知道任何c,只是lua,php和html,对不起)
      • @user677756:维基百科是你的朋友:en.wikipedia.org/wiki/Bitwise_operation
      【解决方案5】:

      &amp; 是按位与运算符。所以&amp; 0x7fffffff 从 32 位整数中剥离带符号位。这意味着,它使int 的最左边位为零。

      在第二个中,第一个 n 使用左移运算符 &lt;&lt; 将第一个 n 左移 13,并将此表达式的结果用于与 n 本身进行异或运算。

      【讨论】:

        猜你喜欢
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 2021-08-30
        • 1970-01-01
        相关资源
        最近更新 更多