本题要求:
昨天写了2个正数相乘,今天让我们来用位操作符写2个正负数相乘吧,给定2个数a,b,计算a*b
输入格式:
a b
输出格式:
a*b的值
输入样例:
155 -152
输出样例:
-23560
解题思路 :
负数乘法跟正数乘法运算一样。我们只需要把负数变成正数并且记录哪个是负数,最后根据这个二个数是否是负数的情况来判断r是否为负数。
代码 :
#include <iostream>
using namespace std;
int add(int a, int b) {
if (b == 0) {
return a;
}
int s = a ^ b;
int c = (a & b) << 1;
return add(s, c);
}
bool isFuShu(int a) {
a >>= (sizeof(int) * 8 - 1);
return (a & 1);
}
int multi(int a, int b)
{
bool za = false;
bool zb = false;
if (isFuShu(a)) {
za = true;
a = add(~a, 1);
}
if (isFuShu(b)) {
zb = true;
b = add(~b, 1);
}
int r = 0;
while (b)
{
if(b & 1) {
r = add(r,a);
}
a <<= 1;
b >>= 1;
}
if (za != zb) {
r = add(~r, 1);
}
return r;
}
int main() {
int a, b;
cin >> a >> b;
cout << multi(a, b);
return 0;
}