zoukankan      html  css  js  c++  java
  • 面试常见题

      这2个题比较简单,但是如果没想到还是做不出来的,请不要小看它。。

    1.不通过比较找出2个数中的较大值(较小值)

      方法一:通过位运算来实现

        max=a - ((a - b) & ((a - b) >> 31));

      方法二:就是通过数学公式

        max = ((a+b)+|a-b|)/2;

      求较小者时:a+b-max即可。

    2.不通过中间变量实现交换2个变量的值

      方法一:加减法原则

        a=a+b;

        b=a-b;

        a=a-b; 

      方法二:乘除法原则(b!=0,并且此方法容易造成溢出,不推介使用)

        a=a*b;

        b=a/b;

        a=a/b;

       方法三:异或法

        a^=b;

        b^=a;

        a^=b;

        方法四:在代码中嵌入汇编代码的方法(避免了临时变量的引入,但究其本质还是会使用额外的存储空间

        (1)使用xchg指令,这也是比较直观、容易想到的方法,因为xchg指令的功能就是交换源操作数和目的操作数的值,这里要使用额外寄存器来暂存变量。

          内嵌汇编代码如下:

                   _asm

                      {

                           mov eax,a

                           xchg b,eax

                           mov a,eax

                      }

        (2)使用额外的栈。这里使用反向的出栈顺序来完成交换。

          内嵌代码有如下两种形式:

               _asm

                   {

                         push a

                         push b

                         pop a

                         pop b

                   }

          另一种形式:

                   _asm push a

                   a = b;

                   _asm pop a

        (3)使用mov指令。这种方法使用额外寄存器来暂存一个变量的值。

               _asm mov eax,a

               a = b;

               _asm mov b,eax

      参看文档:Ronli (Http://Ronli.cnblogs.com/)

        

  • 相关阅读:
    自己设计的SSO登录流程图
    Java泛型:泛型类、泛型接口和泛型方法
    Java中泛型的各种使用
    Java总结篇系列:Java泛型
    java生成MD5校验码
    Android SQLite数据库之事务的学习
    Android SQLite详解
    android删除表和清空表
    Android 软键盘自动弹出和关闭
    java中表示二进制、八进制、十进制、十六进制
  • 原文地址:https://www.cnblogs.com/czx1/p/5471251.html
Copyright © 2011-2022 走看看