题目: 求较小的值,不能用 比较运算符 if-else ?: while for 内嵌汇编 递归 第三方函数
int Min(int a, int b)
{
//write code here
}
解法(来自网络):
int Min(int a, int b) {
int p[] = {a, b};
return p[1 - ( ((long long)a - (long long)b) >> (sizeof(long long)*8 -1) )& 0x1]; //a b相减后看结果的符号位是0、1, 然后返回适当的值
//或者 int index = ( ((long long)a - (long long)b) >> (sizeof(long long)*8 -1) )& 0x1;
// return index * a + (1-index)*b;
}
解法2(来自网络):
int Min(int a, int b) {
unsigned int x = a;
unsigned int y = b;
unsigned int z = (x - y) >> 31;
x >>= 31;
y >>= 31;
int result = ((x ^ y) && (z ^ x)) ^ z; //前面判断溢出 ?? 判断溢出可能有问题
return result * a + (1 - result) * b;
}
ps:
1. long long 的转换为了防止溢出
2. &0x1 是为了屏蔽不同机器算数移位和逻辑移位带来的兼容性问题
3. 如果这样实现 return (&b)[(a-b)>>31], 会有兼容性问题, 因为参数入栈顺序可能不确定,也可能会通过寄存器传递参数