面试常见题
這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/)
?
轉載于:https://www.cnblogs.com/czx1/p/5471251.html
總結
- 上一篇: Android项目Build报错Unab
- 下一篇: 最短路算法整理 1557 热浪