文章目录
不用任何比较判断找出两个数中较大的数
题目
给定两个32位整数a和b,返回a和b中较大的数。
要求:不用任何比较判断
代码
#include<iostream>
#include<algorithm>
using namespace std;
int flip(int n)
{
return n ^ 1;
}
int sign(int n)
{
return flip((n >> 31) & 1);
}
int getMax(int a, int b)
{
int c = a - b;
int scA = sign(c);
int scB = flip(scA);
return a * scA + b * scB;
}//此方法无法避免溢出的问题
int getMax2(int a, int b)
{
int c = a - b;
int sa = sign(a);
int sb = sign(b);
int sc = sign(c);
int difSab = sa ^ sb;
int sameSab = flip(difSab);
int returnA = difSab * sa + sameSab * sc;
int returnB = flip(returnA);
return a * returnA + b * returnB;
}
int main()
{
int a, b;
cin >> a >> b;
int res = getMax(a, b);
cout << res << endl;
getchar();
return 0;
}
只用位运算不用算术运算实现整数的加减乘除运算
题目
给定两个32位整数a和b,可正、可负、可0。不能使用算术运算符,分别实现a和a的加减乘除运算。
要求:如果给定的a和b执行加减乘除的某些救过本来就会导致数据的溢出,那么你实现的函数不必对这些结果负责
代码
#include<iostream>
using namespace std;
/*位加法*/
int bitAdd(int a, int b)
{
int sum = a;
while (b != 0)
{
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
/*位减法*/
int negNum(int n)
{
return bitAdd(~n, 1);
}
int bitMinus(int a, int b)
{
return bitAdd(a, negNum(b));
}
/*位乘法*/
int bitMulti(int a, int b)
{
int res = 0;
while (b != 0)
{
if ((