java用位运算实现加减乘除

Posted 熬夜磕代码丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java用位运算实现加减乘除相关的知识,希望对你有一定的参考价值。

个人主页:熬夜磕代码丶
作品专栏: java se
我变秃了,也变强了
给大家介绍一款程序员必备刷题平台——牛客网
点击注册一起刷题收获大厂offer吧

文章目录

前言

我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.


一、常见位运算

1. &运算

&运算二进制每一位全1为1,否则为0

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a & b);
    


2. |运算

|运算二进制每一位有1为1,全0为0

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a | b);
    


3. ^运算

^运算二进制每一位不同为1,相同为0

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a ^ b);
    


4. ~运算

~运算是二进制每一位按位取反.

public static void main(String[] args) 
        int a = 1;
        System.out.println(~a);
    


二、位运算实现加法

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a + b);
    


下来我们用位运算实现一下加法.

我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.

进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.

我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为0时,我们的异或运算的结果即为加法的结果.

public static int bitAdd(int a,int b) 
        int sum = 0;
        while(b != 0) 
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        
        return sum;
    

    public static void main(String[] args) 
        System.out.println(bitAdd(1,2));
    

三、位运算实现减法

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a - b);
    


下来我们用位运算实现一下减法.
在我们有了位运算实现加法的基础之后,我们的减法就变得简单了,a - b == a + ( -b ),所以我们只需要将b变为-b即可实现减法功能,但我们不能使用负号,那我们来用位运算来实现一下.

public static void main(String[] args) 
        System.out.println(~3);
    


我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.

public static void main(String[] args) 
        System.out.println(~3 + 1);
    

public static int bitAdd(int a,int b) 
        int sum = 0;
        while(b != 0) 
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        
        return sum;
    

    public static int bitSub(int a,int b) 
        return bitAdd(a,~b+1);
    

    public static void main(String[] args) 
        System.out.println(bitSub(1,3));
    

四、位运算实现乘法

public static void main(String[] args) 
        int a = 1;
        int b = 3;
        System.out.println(a * b);
    


我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.

二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位

public static int bitAdd(int a,int b) 
        int sum = 0;
        while(b != 0) 
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        
        return sum;
    
    public static int bitMul(int a,int b) 
        int sum = 0;
        while(b != 0) 
            if((b & 1) != 0) 
                sum += a;
            
            a <<= 1;
            b >>>= 1;
        
        return sum;
    

    public static void main(String[] args) 
        System.out.println(bitMul(1,3));
    

四、位运算实现除法

public static void main(String[] args) 
        int a = 7;
        int b = 2;
        System.out.println(a / b);
    


我们在用位运算实现除法时,采用逆推的方式,a / b = c,
a = c * b。


我们只需要求出a减去b向左的移位,只要满足a <= b的移位即可,每次移动多少位即a / b的结果二进制中某一位为1,以此循环倒推即可.


public static int bitAdd(int a,int b) 
        int sum = 0;
        while(b != 0) 
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        
        return sum;
    
    public static int negNum(int n) 
        //转化为相反数
        return bitAdd(~n,1);
    
    public static int minus(int a,int b) 
        //实现两个数相减
        return bitAdd(a,negNum(b));
    
    public static boolean isNeg(int n) 
        //判断是否为负数
        return n < 0;
    
    public static int bitDiv(int a,int b) 
        int x = isNeg(a) ? negNum(a) : a;
        int y = isNeg(b) ? negNum(b) : b;
        int res = 0;
        for (int i = 30; i >= 0 ; i = minus(i,1)) 
            if((x >> i) >= y) 
                res |= (1 << i);
                x = minus(x,y << i);
            
        
        return isNeg(a) != isNeg(b) ? negNum(res) : res;

    

    public static void main(String[] args) 
        int a = 7;
        int b = 2;
        System.out.println(bitDiv(a,b));
    

c_cpp 用位运算实现四则运算之加减乘除的.c

#include<iostream>
#include<cstdlib>
using namespace std;

//递归版本的加法实现
int Add(int a, int b)
{
    return b ? Add(a^b, (a&b)<<1) : a;
    /*
    if(b)
        return plus_rec(a^b, (a&b)<<1);
    else
        return a;
        */
}

//该为迭代版本
int Add_iter(int a, int b)
{
    int ans;
    while(b)
    {
        ans = a^b;
        b = (a&b)<<1;
        a = ans;
    }
    return ans;
}

//求a的相反数:将各位取反加一
int negative(int a)     //get -a
{
    return Add(~a, 1);
}

int Minus(int a, int b)
{
    return Add(a, negative(b));
}

//正数乘法
int Multi(int a, int b)
{
    int ans = 0;
    while(b)
    {
        if(b&1)
            ans = Add(ans, a);
        a = a << 1;
        b = b >> 1;
    }
    return ans;
}

//正数除法
int Divide(int a, int b)
{
    int coun = 0;
    while(a >= b)
    {
        a = Minus(a, b);
        coun = Add(coun, 1);
    }
    return coun;
}

//判断是否是负数,0,正数
int isneg(int a)
{
    return a & 0x8000;
}
int iszero(int a)
{
    return !(a & 0xFFFF);
}
int ispos(int a)
{
    return (a&0xFFFF) && !(a&0x8000);
}

//处理负数的乘法和除法
int My_Multi(int a, int b)
{
    if(iszero(a) || iszero(b))
        return 0;
    if(isneg(a))
    {
        if(isneg(b))
            return Multi(negative(a), negative(b));
        else
            return negative(Multi(negative(a), b));
    }else if(isneg(b))
        return negative(Multi(a, negative(b)));
    else
        return Multi(a, b);
}

int My_Divide(int a, int b)
{
    if(iszero(b))
    {
        cout << "Error!" << endl;
        exit(1);
    }
    if(iszero(a))
        return 0;
    if(isneg(a))
    {
        if(isneg(b))
            return Divide(negative(a), negative(b));
        else
            return negative(Divide(negative(a), b));
    }else if(isneg(b))
        return negative(Divide(a, negative(b)));
    else
        return Divide(a, b);

}

int main(int argc, char **argv)
{
    int a = 5;
    int aa = -5;
    int b = 3;
    int bb = -3;
    int c = 15;
    cout << Add(a, b) << endl;
    cout << Add(a, bb) << endl;
    cout << Minus(a, b) << endl;
    cout << Minus(b, a) << endl;
    cout << Multi(a, b) << endl;
    cout << My_Multi(aa, b) << endl;
    cout << Divide(c, a) << endl;

    return 0;
}

以上是关于java用位运算实现加减乘除的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 用位运算实现四则运算之加减乘除的.c

java位移运算符有啥意义

加减乘除求余 利用 位运算实现(详细)

java实现四则运算

java加减乘除是啥类

算法笔记_156:算法提高 6-17复数四则运算(Java)