C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_450_4@ 正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位操作来计算它.

他们只做y = x>> 1;

这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?

也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?

解决方法@H_696_15@
这个问题已经在riDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.html

int halve_it(int X) {
   return x / 2;
}

int halve_it(int X) {
   return x >> 1;
}

优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.

编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf

你的优化在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    $0x7,%eax
  401399:   c1 f8 04                sar    $0x3,%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    $0x3,%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是整数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。