以下哪一种技术是整数除2的最佳选择,为什么?
技巧1:
x = x >> 1;
技巧2:
x = x / 2;
这里x是整数。
以下哪一种技术是整数除2的最佳选择,为什么?
技巧1:
x = x >> 1;
技巧2:
x = x / 2;
这里x是整数。
当前回答
我同意其他答案,你应该支持x / 2,因为它的意图更清楚,编译器应该为你优化它。
然而,选择x / 2而不是x >> 1的另一个原因是,如果x是一个有符号int并且是负的,那么>>的行为是依赖于实现的。
ISO C99标准第6.5.7节第5项:
E1 >> E2的结果是E1位右移E2位位置。如果E1 无符号类型,或者E1有符号类型且值为非负值, 结果值为E1 /商的积分部分 2 e2。如果E1具有符号类型和负值,则结果值为 是由实现定义的。
其他回答
使用除法(/),假设这样更清楚。编译器将相应地进行优化。
一般右移分为:
q = i >> n; is the same as: q = i / 2**n;
这有时被用来加快程序的速度,但以清晰度为代价。我觉得你不应该这么做。编译器足够智能,可以自动执行加速。这意味着,以清晰度为代价,你不会获得任何好处。
看看《实用c++编程》的这一页。
我同意其他答案,你应该支持x / 2,因为它的意图更清楚,编译器应该为你优化它。
然而,选择x / 2而不是x >> 1的另一个原因是,如果x是一个有符号int并且是负的,那么>>的行为是依赖于实现的。
ISO C99标准第6.5.7节第5项:
E1 >> E2的结果是E1位右移E2位位置。如果E1 无符号类型,或者E1有符号类型且值为非负值, 结果值为E1 /商的积分部分 2 e2。如果E1具有符号类型和负值,则结果值为 是由实现定义的。
Knuth说:
过早的优化是万恶之源。
所以我建议用x /= 2;
这样代码很容易理解,而且我认为这种形式的操作优化,对处理器来说不会有太大的区别。
X/Y是正确的…和" >> "移位运算符..如果我们想要二除一个整数,我们可以使用(/)被除数运算符。移位运算符用于移位位。
x = x / 2; x / = 2;我们可以这样用…