编程急转弯
题目
给定两个 int 型变量,如何在不使用条件运算符以及条件判断语句的情况下,输出较大的那个数?
解题思路
根据简单的数学知识可得:
Max(a,b) = ((a + b) + |a - b|)) / 2;
那么就可以写下以下的代码:
#include <iostream>
#include <functional>
using namespace std;
int main()
{
cout << "Just give me numbers!" << endl;
int a;
int b;
cin >> a >> b;
function<bool(int, int)> fucker = [](int a, int b)->bool
{
return (bool)~((a - b) >> 31);
};
int bigger = ;
cout << "The bigger one is " << ((a + b) + (int)fucker(a, b) * (a - b) + (int)fucker(b, a) * (b - a)) / 2 << endl;
}
这里第 10 行的 fucker
函数就是为了解决取绝对值的问题:
我们知道,Int 32 的最高位指示的是数值的正负,正数的最高位是 0,负数的最高位是 1,所以右移 31 位,正数就会变成 0,负数就会变成 -1(也就是 0xFFFFFFFF)。然后再对移位结果取反,并强制转换为 bool 类型,这样正数就变成了 1 ,负数就变成了 0
之后,我们就可以通过
(int)fucker(a, b) * (a - b) + (int)fucker(b, a) * (b - a))
求出 |a - b|。