zoukankan      html  css  js  c++  java
  • 不用if、while、for、switch等语句及系统函数,实现求两数中的最大数的函数

          今天看到的这个题,觉得有意思,就做了一下。。。

    思路:
                如果有两个数,要么相等,要么不相等;如果两数不相等,
    那它们就存在差值的关系(1和5的差值是4,-2和3的差值是5)。
    两数如果相减的话,那么就会得出它们的差值:

    c=a-b

    如果c为负数,那么a<b
    如果c为正数,那么a>b
    于是,现在就可以通过c的符号位来判断哪个数大了。
    当然,要先取得c的符号位才行(1或者0),
    用以下操作实现:

    符号位=!((c&0x80000000)<<1==(c&0x80000000))

    这个操作应该不难,有点C语言基础的都能看懂嘛~~就不细说了。

    因为我现在要实现这么一个操作:

    如果a<b,max=b;
    如果a>b,max=a;

    由于得到了符号位,就可以这样做:

    如果是正数,那么max=a-0;
    如果是负数,那么max就等于a减去这个负数,
    这样就相当于把一个指向a的指针,移了|c|个单位,指向b。

    所以,就要得到a的减数(0或它自身),最简单的实现方法就是:

    减数=减数*符号位;

    即,c=c*!((c&0x80000000)<<1==(c&0x80000000))

    最后,a减去一个c,就能得到最大的数了。。。


    函数代码部分(c++):

    int GetMax(int a,int b)
    {
     int c;
     int max;
     c=a-b;
        c=c*!((c&0x80000000)<<1==(c&0x80000000));
        max=a-c;
     return max;
    }


    8过有个缺点就是,该程序只能在32位机上可以正确运行,
    因为c言语里面没有循环左移,所以取符号位的时候有点生硬,
    虽然可以嵌入汇编,但既然是写算法就写纯c算了。。。

  • 相关阅读:
    oracle 调优3
    ifconfig找不到命令的帖子 精选
    执行计划中各字段各模块描述
    oracle统计信息
    oracle中 rownum与rowid的理
    触发器
    开园第一天
    Asp.net生成htm静态文件的两种途径
    避免刷新页面,自动跳回到页面顶部的办法
    ASP.NET二级域名站点共享Session状态
  • 原文地址:https://www.cnblogs.com/Random/p/714404.html
Copyright © 2011-2022 走看看