每日一题 No.20 a*b(位操作符)【正负数】

来源:互联网 发布:大白菜会计软件 编辑:程序博客网 时间:2024/06/05 22:30

本题要求:

昨天写了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;  }   
0 0
原创粉丝点击