这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/)