- 论坛徽章:
- 0
|
不用判断语句,求两个数的最大值
这段代码的简单说明:
- #define MASK 0x7fffffff
- int max (int x, int y)
- {
- int z;
- z = (x>;>;31) - (y>;>;31) + (((x&MASK) - (y&MASK))>;>;31);
- z= (z+1)*(z+2)*(3-2*z)/6;
- return z*x + (1-z)*y;
-
- }
复制代码
思路:计算 x-y 的差,自己处理进位:
第一行:
(((x&MASK) - (y&MASK))>;>;31) 计算低 31 位相减后的符号,0 或 -1。也可以看成低 31 位相减后对高位的 借位。
(x>;>;31) - (y>;>;31) 是第 32 位的差,带符号扩展
z = (x>;>;31) - (y>;>;31) + (((x&MASK) - (y&MASK))>;>;31);
处理进位.
第二行:
可以分析出,z 有四种可能的值,1, 0, -1, -2。其中
1, 0 对应 x>;=y, -1, -2 对应 x < y
我对 z 作一个修正,即一个映射,把 1, 0 对应为 1; -1, -2 对应为 0。映射可用 Lagrange 插值公式得到。
第三行:
还是 Lagrange 插值, 1 ->; x, 0 ->; y
ps>; 第二行也可以直接从最高位判断正负。 |
|