编程急转弯

编程急转弯

题目

给定两个 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|。

posted @ 2016-11-04 22:59  不如隐茶去  阅读(210)  评论(0编辑  收藏  举报