他们只做y = x>> 1;
这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?
也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?
解决方法 这个问题已经在rIDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.htmldivision by 2 to right shiftWill GCC transform an integer division by 2 to a right shift?
@H_301_31@int halve_it(int x) { return x / 2;}int halve_it(int x) { return x >> 1;}The right shift operator is equivalent to division that rounds towards
negative infinity,but normal division rounds towards zero. Thus the
proposed optimization will produce the wrong result for odd negative
numbers.The result can be “fixed up” by adding the most significant bit to the
@H_301_31@
numerator before shifting,and gcc does this.优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.
编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf
In C89,division of integers involving negative operands Could round upward or downward in an implementation-defined manner; the intent was to avoID incurring overhead in run-time code to check for special cases and enforce specific behavior. In Fortran,however,the result will always truncate toward zero,and the overhead seems to be acceptable to the numeric programming community. Therefore,C99 Now requires similar behavior,which should facilitate porting of code from Fortran to C. The table in §7.20.6.2 of this document illustrates the required semantics.
@H_301_31@你的优化在C89中是正确的,因为它让编译器按照自己的意愿去做.但是,C99引入了一个符合Fortran代码的新约定.以下是除法运算符的预期示例(始终来自同一文档):
不幸的是,您的优化不符合C99标准,因为它没有给出x = -1的正确结果:
#include <stdio.h>int div8(int x){ return x/3;}int rs8( int x ){ return x >> 3;}int main(int argc,char *argv[]){ volatile int x = -1; printf("div : %d \n",div8(x) ); printf("rs : %d \n",rs8(x) ); return 0;}Result:div : 0 rs : -1 [Finished in 0.2s]如果查看已编译的代码,可以发现一个有趣的区别(使用g v4.6.2编译):
0040138c <__Z4div8i>: 40138c: 55 push %ebp 40138d: 89 e5 mov %esp,%ebp 40138f: 8b 45 08 mov 0x8(%ebp),%eax 401392: 85 c0 test %eax,%eax 401394: 79 03 jns 401399 <__Z4div8i+0xd> 401396: 83 c0 0f add x7,%eax 401399: c1 f8 04 sar x3,%eax 40139c: 5d pop %ebp 40139d: c3 ret 0040139e <__Z3rs8i>: 40139e: 55 push %ebp 40139f: 89 e5 mov %esp,%ebp 4013a1: 8b 45 08 mov 0x8(%ebp),%eax 4013a4: c1 f8 03 sar x3,%eax 4013a7: 5d pop %ebp 4013a8: c3 ret在第401392行,有一个测试指令,它将检查奇偶校验位,如果数字为负,则将加1 <<<右移3个单位之前(n-1)= 7到x.
总结以上是内存溢出为你收集整理的c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数全部内容,希望文章能够帮你解决c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)