使用按位操作

  • 你经常使用按位操作“黑客”来进行某种优化? 它在哪种情况下真的有用?
  • 示例:而不是使用if:

    if (data[c] >= 128) //in a loop
        sum += data[c];
    

    你写:

    int t = (data[c] - 128) >> 31;
    sum += ~t & data[c];
    

    当然,假设它在这个特定的情况下有相同的预期结果。

  • 这值得么? 我觉得它是不可读的。 你多久碰到一次?
  • 注意:我在选择的答案中看到了下面的代码:为什么处理排序后的数组要比未排序的数组快?


    按位操作非常有用, 克努特写了一本书abot他们:http://www.amazon.com/The-Computer-Programming-Volume-Fascicle/dp/0321580508

    只需要提一些最简单的例子:int乘法和除以2的幂(使用左右移位),mod关于2的幂,掩码等等。 在使用按位操作时,请务必提供有关正在发生的事情的足够评论。

    但是,您的示例data[c]>128不适用IMO,只是保持这种方式。 但是如果你想计算data[c] % 128那么data[c] & 0x7f要快得多(其中&代表按位AND)。


    虽然该代码是一个很好的方式来显示发生了什么,我通常不会使用这样的代码。 如果速度很快,通常会有更快的解决方案,例如在x86上使用SSE或在ARM上使用NEON。 如果没有可用的,当然,我会使用它,只要它有帮助并且是必要的。

    顺便说一下,我解释了它在这个答案中的工作原理

    就像Skylion一样,我用了很多东西就是搞清楚一个数字是不是两个幂。 想一想你会怎么做,然后看看这个: (x & (x - 1)) == 0 && x != 0

    我想你第一次看到它会很棘手,但是一旦你习惯了它,它就会比任何不使用位图的替代品简单得多。 它的工作原理是因为从数字中减去1意味着借入从数字的最右端开始并遍历所有的零,然后在第一个变为零时停止。 与原来的数字进行比较,然后使最右边的1为零。 两个权力只有一个1,消失,留下零。 所有其他数字将剩下至少一个1,除了零以外,这是一种特殊情况。 一个常见的变体不会测试为零,并且可以将其视为两个幂或知道零不会发生。

    同样,还有其他一些你可以轻松做到的事情,但没有那么容易。 正如他们所说,使用正确的工具来完成这项工作。 有时候,比特币是正确的工具。


    有几种情况使用这种黑客可能会有用。 例如,他们可以删除一些Java虚拟机“优化”,如分支预测器。 我发现它们在少数情况下只能使用一次。 主要的是乘以-1。 如果你在一个庞大的数组中执行数百次,那么简单地翻转第一位比实际多位更高效。 我使用过的另一个例子是知道一个数是否是2的幂(因为它很容易用二进制来表示)。基本上,当你想要作弊时,有点黑客是有用的。 这是一个人类的比喻。 如果你有数字列表,你需要知道它们是否大于29,你可以自动知道第一个数字是否大于3,那么整个数字大于30,反之亦然。 按位操作只是允许你对二进制执行类似的作弊。

    链接地址: http://www.djcxy.com/p/6201.html

    上一篇: Using bitwise operations

    下一篇: if else statement in AngularJS templates