用整数除以2是更好的选择?

以下哪种技术是将整数除以2的最佳选择,为什么?

技术1:

x = x >> 1;

技术2:

x = x / 2;

这里x是一个整数。


使用最能描述你正在尝试做什么的操作。

  • 如果您将数字视为一系列位,请使用bitshift。
  • 如果您将其视为数值,请使用除法。
  • 请注意,它们并不完全等效。 他们可以为负整数给出不同的结果。 例如:

    -5 / 2  = -2
    -5 >> 1 = -3
    

    (ideone)


    第一个看起来像分裂吗? 不可以。如果你想分割,使用x / 2 。 如果可能的话,编译器可以优化它以使用位移(这就是所谓的强度降低),如果你自己做,它就是无用的微型优化。


    堆积如山:有许多理由支持使用x = x / 2; 这里有一些:

  • 它更清楚地表达你的意图(假设你没有处理位寄存器位或其他事情)

  • 无论如何,编译器会将其减少到移位操作

  • 即使编译器没有减少它,并选择了比shift更慢的操作,但这最终影响程序性能的可能性本身也非常小(如果它确实影响了它,那么你就有一个实际的理由使用换班)

  • 如果该部门将成为较大表达式的一部分,则如果使用除法运算符,则更有可能获得优先权:

    x = x / 2 + 5;
    x = x >> 1 + 5;  // not the same as above
    
  • 有符号的算术可能会比上面提到的优先级问题更复杂

  • 重申 - 无论如何编译器已经为你做了这个。 事实上,它将把常数转换为一系列的转换,增加并乘以各种数字,而不仅仅是两个幂。 请参阅此问题以获取有关此更多信息的链接。

  • 简而言之,如果你真的想要繁殖或分裂,你就不会购买任何东西,除非增加了引入错误的可能性。 这是一辈子的,因为编译器不够聪明,可以在适当的时候优化这种事情。

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

    上一篇: Which is better option to use for dividing an integer number by 2?

    下一篇: Printing 1 to 1000 without loop or conditionals