zoukankan      html  css  js  c++  java
  • C++运算各版本学习

    DEBUG:

    除数是2 的倍数


    除数不是2 的倍数



    release版本  

    1)除数为 2 的倍数+ 禁止调试

    	int a = -160;
    	a = a / 16;
    	printf("%d",a);


    商是-10  余数也是-10的




    2)除数不为2的倍数  + 正数+最快速度

    #include "stdafx.h"
    
    	int a = 10;
    int main(int argc)
    {
    
    	printf("%d",a/3);
    	return 0;
    }


    流程:


    10/3   =   10*  (2^n /(3*2^n)) =    10  *    (2^n/3) *  (1/2^n)

    (2^n/3) = 幻数

    然后将eax向右移动1F(31),那么此时eax只剩下一个原来的符号位的值了
    然后将这个原符号位的值加上edx,就是说:
    如果edx的值为正数的话,那么符号位为0add edx,0之后 edx的值不变
    如果edx的值为负数的话,那么符号位为1add edx,-1之后 edx的值 +1

    学习参考:

    http://www.cppblog.com/huyutian/articles/124742.html

    http://blog.sina.com.cn/s/blog_62d718780100mqmm.html

    最后结果怎么除数    =     2^找出移动多少位N / 幻数





    3)除数不为2的倍数  +负数+最快速度

    #include "stdafx.h"
    
    	int a = -10;
    int main(int argc)
    {
    
    	printf("%d",a/3);
    	return 0;
    }


    那么   100000000 /0x55555556 = 2

    +1 就是 3  所以除数为3





    4)除数不为2的倍数  +无符号被除数数+最快速度             难度+1

    4)除数不为2的倍数  +有符号被除数数+最快速度             难度+1


    浮点指令DEBUG:

    1)

    2)



    取模运算 % RELEASE

    最快速度  除数为 2 的幂


    #include "stdafx.h"
    
    int main(int argc, char* argv[])
    {
    	printf("%d",argc%2);
    	
    	return 0;
    }
    0x80000001  为
    10000000000000000000000000000001

    后面是1位  那么  1  代入  2^k      为2    那么就是  %2



    最快速度  除数为 -2 的幂


    and eax,0x1

    看到这里   就是  %2


    条件表达式:

    1)


    2)


    3)printf("%d",argc <= 8?5:10);   release 最快速度


    4)  printf("%d",argc >= 8?5:10);   release 最快速度



    __FASTCALL 调用方式



    release 版本下 = 

    在  编译器  O2 选项下  _cdecl调用方式并不一定会马上平衡栈顶,极有可能会复写传播并与其他函数一起平衡堆栈

















  • 相关阅读:
    [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
    mysqlsla slow-query常用用法
    [POI2000]病毒
    mysqlsla安装
    mysqldumpslow
    [学习笔记]约数
    查看MySQL数据的连接
    [学习笔记]质数
    关于ulimit -a中需要修改的两个值
    Miller-Rabin与二次探测
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982410.html
Copyright © 2011-2022 走看看