#include <iostream>
#include <stdio.h>
using namespace std;
/*
问题:编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
分析:这个好像就是T面试的一道题。首先明白大的数字有什么特点,大的数字= 两个数字的和 - 小的数字,较大的数字。我想起来了,
好像是用绝对值的做法来做的,构造差值。
令result = (|a+b| + |a-b|) / 2;
那么,如果a > b ,则有: result = a;符合要求
输入:
3 5
3 -5
输出:
5
3
关键:
1 一看到什么交换两个数,求两个数的较大值,就应该想到构造差值来做,或者用异或
2 整数相加减,乘除要考虑溢出
if 两个数符号不同,即 sign(a) ^ sign(b) = 1
if a > 0 , b < 0 , sign(a) = 1,
else sign(a) = 0
else,即 sign(a) ^ sign(b) = 0
if a > b ,sign(a - b) = 1
else sign(a-b) = 0
最终结果:
a * k + b * q
必须符合:
a > b,k=1 符号不同:k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b)
相同:
a < b, k=0 符号相同: q= XOR(k)
3
//与1异或处理,1返回0,0返回1;这个其实是取反的函数
int XOR(int bit)
{
return 1^bit;
}
//如果数字为正返回为1,否则返回0;采用右移31位和进行异或比较的方式
int sign(int num)
{
//只获取第32位符号位
int bit = (num >> 31) & 0x1;
int result = XOR(bit);
return result;
}
*/
bool isOverflow(int num)
{
if( num > INT_MAX || num < INT_MIN )
{
return true;
}
else
{
return false;
}
}
//与1异或处理,1返回0,0返回1;这个其实是取反的函数
int XOR(int bit)
{
return 1^bit;
}
//如果数字为正返回为1,否则返回0;采用右移31位和进行异或比较的方式
int sign(int num)
{
//只获取第32位符号位
int bit = (num >> 31) & 0x1;
int result = XOR(bit);
return result;
}
/*
获取较大的数
if 两个数符号不同,即 sign(a) ^ sign(b) = 1
if a > 0 , b < 0 , sign(a) = 1,
else sign(a) = 0
else,即 sign(a) ^ sign(b) = 0
if a > b ,sign(a - b) = 1
else sign(a-b) = 0
最终结果:
a * k + b * q
必须符合:
a > b,k=1 符号不同:k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b)
相同:
a < b, k=0 符号相同: q= XOR(k)
*/
int getMaxNumber(int a , int b)
{
int sign1 = sign(a);
int k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b);
int q = XOR(k);
int result = a * k + b * q;
return result;
}
//这个方法的缺点:在于:有可能发生溢出
int getBiggerNumber(int num1 , int num2)
{
//如果不溢出
int result;
result = getMaxNumber(num1 , num2);
/*
if( !isOverflow(num1 + num2) && !isOverflow(num1 - num2) )
{
result = ( abs(num1 + num2) + abs(num1 - num2) ) / 2;
}*/
return result;
}
//为了不发生溢出
void process()
{
int num1 , num2;
while(cin >> num1 >> num2)
{
int result = getBiggerNumber(num1 , num2);
cout << result << endl;
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}