加减乘除的位运算封装

简单实现的加减乘除位运算:

#include <iostream>

#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <cstring>
using namespace std;
//--------------------------------加
int add_1(int a,int b){
    if(b == 0)
        return a;
    int s = a ^ b;
    int c = (a&b)<<1;
    return add_1(s,c);
}

int add_2(int a,int b){
    int s;
    int c;
    while(b != 0){
       s = a ^ b;
       c = (a & b)<<1;
       a = s;
       b = c;
    }
    return s;
}
//-------------------------------减
int contrast(int i){
    return add_1(~i,1);
}
int subtraction(int a,int b){
    return add_1(a,contrast(b));
}
//-------------------------------乘
int getsign(int i){
    return (i>>31);
}
int bepositive(int i){
    if(i>>31)
        contrast(i);
    else
        return i;
}

int multiplay_1(int a,int b){
    bool flag = true;
    if(getsign(a) == getsign(b)){
        flag = false;
    }
    a = bepositive(a);
    b = bepositive(b);
    int sum = 0;
    while(b){
        sum = add_1(sum,a);
        b = subtraction(b,1);
    }
    if(flag) return contrast(sum);
    else return sum;
}

int multiplay_2(int a,int b){
    bool flag = true;
    if(getsign(a) == getsign(b)){
        flag = false;
    }
    a = bepositive(a);
    b = bepositive(b);
    int sum = 0;
    while(b){
        if(b & 1){
            sum = add_1(sum,a);
        }
        a = a<<1;
        b = b>>1;
    }
    if(flag) return contrast(sum);
    else return sum;
}
//-------------------------------除
int division_1(int a,int b){
    if(b == 0){
        return 0;
    }
    bool flag = true;
    if(getsign(a) == getsign(b)){
        flag = false;
    }
    a = bepositive(a);
    b = bepositive(b);
    int sum = 0;
    a = subtraction(a,b);
    while(a>=0){
        sum = add_1(sum,1);
        a = subtraction(a,b);
    }
    if(flag) return contrast(sum);
    else return sum;
}

int division_2(int a,int b){
    if(b == 0){
        return 0;
    }
    bool flag = true;
    if(getsign(a) == getsign(b)){
        flag = false;
    }
    a = bepositive(a);
    b = bepositive(b);
    int sum = 0;
    int i = 31;
    while(i >= 0){
        if((a >> i) >= b) {
           sum = add_1(sum,1<<i);
           a = subtraction(a,b<<i);
        }
        i = subtraction(i,1);
    }
    if(flag) return contrast(sum);
    else return sum;
}


int main(){
    cout<<add_1(4,7)<<endl;
    cout<<add_2(4,7)<<endl;
    cout<<subtraction(4,7)<<endl;
    cout<<multiplay_1(4,7)<<endl;
    cout<<multiplay_2(4,7)<<endl;
    cout<<division_1(40,7)<<endl;
    cout<<division_2(40,7)<<endl;

    return 0;
}

全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务