0


java用位运算实现加减乘除

在这里插入图片描述

文章目录

前言

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


一、常见位运算

1. &运算

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

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a & b);}

在这里插入图片描述
在这里插入图片描述

2. |运算

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

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a | b);}

在这里插入图片描述
在这里插入图片描述

3. ^运算

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

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a ^ b);}

在这里插入图片描述
在这里插入图片描述

4. ~运算

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

publicstaticvoidmain(String[] args){int a =1;System.out.println(~a);}

在这里插入图片描述
在这里插入图片描述

二、位运算实现加法

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a + b);}

在这里插入图片描述
下来我们用位运算实现一下加法.
在这里插入图片描述
我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.
在这里插入图片描述
进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.
在这里插入图片描述
我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为0时,我们的异或运算的结果即为加法的结果.

publicstaticintbitAdd(int a,int b){int sum =0;while(b !=0){
            sum = a ^ b;
            b =(a & b)<<1;
            a = sum;}return sum;}publicstaticvoidmain(String[] args){System.out.println(bitAdd(1,2));}

在这里插入图片描述

三、位运算实现减法

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a - b);}

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

publicstaticvoidmain(String[] args){System.out.println(~3);}

在这里插入图片描述
我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.

publicstaticvoidmain(String[] args){System.out.println(~3+1);}

在这里插入图片描述

publicstaticintbitAdd(int a,int b){int sum =0;while(b !=0){
            sum = a ^ b;
            b =(a & b)<<1;
            a = sum;}return sum;}publicstaticintbitSub(int a,int b){returnbitAdd(a,~b+1);}publicstaticvoidmain(String[] args){System.out.println(bitSub(1,3));}

在这里插入图片描述

四、位运算实现乘法

publicstaticvoidmain(String[] args){int a =1;int b =3;System.out.println(a * b);}

在这里插入图片描述
我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.
在这里插入图片描述
二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位
在这里插入图片描述

publicstaticintbitAdd(int a,int b){int sum =0;while(b !=0){
            sum = a ^ b;
            b =(a & b)<<1;
            a = sum;}return sum;}publicstaticintbitMul(int a,int b){int sum =0;while(b !=0){if((b &1)!=0){
                sum += a;}
            a <<=1;
            b >>>=1;}return sum;}publicstaticvoidmain(String[] args){System.out.println(bitMul(1,3));}

在这里插入图片描述

四、位运算实现除法

publicstaticvoidmain(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,以此循环倒推即可.

在这里插入图片描述
在这里插入图片描述

publicstaticintbitAdd(int a,int b){int sum =0;while(b !=0){
            sum = a ^ b;
            b =(a & b)<<1;
            a = sum;}return sum;}publicstaticintnegNum(int n){//转化为相反数returnbitAdd(~n,1);}publicstaticintminus(int a,int b){//实现两个数相减returnbitAdd(a,negNum(b));}publicstaticbooleanisNeg(int n){//判断是否为负数return n <0;}publicstaticintbitDiv(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);}}returnisNeg(a)!=isNeg(b)?negNum(res): res;}publicstaticvoidmain(String[] args){int a =7;int b =2;System.out.println(bitDiv(a,b));}

在这里插入图片描述

标签: java jvm 算法

本文转载自: https://blog.csdn.net/buhuisuanfa/article/details/126561132
版权归原作者 熬夜磕代码丶 所有, 如有侵权,请联系我们删除。

“java用位运算实现加减乘除”的评论:

还没有评论