【问题标题】:use of: index & 0x01 [closed]使用:索引和 0x01 [关闭]
【发布时间】:2020-06-26 07:11:35
【问题描述】:

我想知道代码中那个 (index & 0x01) 有什么用?

if(((arr[index] >= 0) && (!(index & 0x01))) 
                || ((arr[index] < 0) && (index & 0x01))) 
{ 
    outofplace = index; 
} 

【问题讨论】:

标签: c++


【解决方案1】:

一个数字是奇数当且仅当它的最后一位数字是奇数,而不管基数如何。所以如果我们想知道数字的奇数,检查最后一位是否设置就足够了。

index & 0x01

当且仅当index 为奇数时,才会为1

【讨论】:

    【解决方案2】:

    如果我们必须推导出一个一般规则,我们可以说对于任何非负数x

    x % y == (x &amp; (y - 1))

    假设y2的正幂。

    这是竞争性编码中的常见技巧。使用它是因为有竞争力的程序员认为按位 AND 比模运算更快。

    在现代编译器中,根本没有性能差异。阅读this thread

    写成0x01而不是1并没有什么特别的原因。两者都编译为相同的程序集!几乎每个人(使用此 hack)= 都使用 1,因为我们必须在 0x01 中额外输入 3 个字符。 :P

    在这种情况下,index &amp; 0x1 等价于index % 2,这只是一个检查数字是否为奇数的条件。 (C++ 中的数组索引总是正数,除非你越界了。)

    【讨论】:

      【解决方案3】:

      正如其他答案所指出的那样,虽然这是一个众所周知的模式(另请参阅Q&A 关于该掩码),它可以被认为是过早的优化。

      我想建议以下替代已发布代码的方法,我觉得它更具可读性。您的里程可能会有所不同。

      // 给一个有意义的名字。
      constexpr auto is_odd = [] (auto x) -> bool {
          返回 x % 2;
      }
      
      // 使用它来简化条件。
      if ( (arr[index] 
          

      【讨论】:

        猜你喜欢
        • 2021-02-14
        • 2023-03-18
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        • 2015-02-23
        • 1970-01-01
        相关资源
        最近更新 更多