大佬教程收集整理的这篇文章主要介绍了c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
他们只做y = x>> 1;
这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?
也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?
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,请注明来意。