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

来源:互联网 发布:淘宝广告 编辑:程序博客网 时间:2024/06/05 15:33

本题要求:

昨天写了2个数相乘,今天让我们来用位操作符写2个正负数相除吧,给定2个数a,b,计算a/b,并输出商和余数

输入格式:

a b

输出格式:

a/b的商 a/b的余数

输入样例:

155 -152

输出样例:

-1 3

解题思路 :

具体的原理看昨天的题,今天主要是将负数的除法写出来~
跟乘法的除法差不多,都是由add来获得负数,再根据被除数和除数的符号来判断商和余数的符号。

代码 :

#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);}int del(int a, int b) {    return add(a, add(~b, 1));}int getBitSize(int a) {    int i = 0;    int c = a;    while (c) {        c >>= 1;        i++;    }    return i;}bool getLeftBit(int a, int size, int n) {    int i = 0;    int c = a;    i = size - n;    while (i-- > 0) {        a >>= 1;    }    return a & 1;}bool isFuShu(int a) {    a >>= (sizeof(int) * 8 - 1);    return (a & 1);}pair<int, int> divide(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 now = 0;    pair<int, int> p(0, 0);    int i = 1;    int size = getBitSize(a);     while (i <= size) {        p.second <<= 1;        p.second |= getLeftBit(a, size, i);        p.first <<= 1;         if (p.second >= b) {            p.second = del(p.second, b);            p.first |= 1;        }        i++;    }    if (za != zb) {        p.first = add(~p.first, 1);    }    if (za) {        p.second = add(~p.second, 1);    }    return p;} int main() {    int a, b;    cin >> a >> b;    pair<int, int> h;    h = divide(a, b);    cout << h.first << " " << h.second << endl;    return 0;  }  
0 0
原创粉丝点击