前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java用位运算实现加减乘除的过程_java四则运算

java用位运算实现加减乘除的过程_java四则运算

作者头像
全栈程序员站长
发布2022-11-15 17:38:20
7880
发布2022-11-15 17:38:20
举报
文章被收录于专栏:全栈程序员必看
在这里插入图片描述
在这里插入图片描述

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

文章目录

前言

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


一、常见位运算

1. &运算

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

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        int b = 3;
        System.out.println(a & b);
    }

Jetbrains全家桶1年46,售后保障稳定

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

2. |运算

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

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        int b = 3;
        System.out.println(a | b);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. ^运算

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

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        int b = 3;
        System.out.println(a ^ b);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. ~运算

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

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        System.out.println(~a);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、位运算实现加法

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        int b = 3;
        System.out.println(a + b);
    }
在这里插入图片描述
在这里插入图片描述

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

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

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

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

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

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

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

代码语言:javascript
复制
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));
    }
在这里插入图片描述
在这里插入图片描述

三、位运算实现减法

代码语言:javascript
复制
public static void main(String[] args) { 
   
        int a = 1;
        int b = 3;
        System.out.println(a - b);
    }
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public static void main(String[] args) { 
   
        System.out.println(~3);
    }
在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
public static void main(String[] args) { 
   
        System.out.println(~3 + 1);
    }
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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));
}
在这里插入图片描述
在这里插入图片描述

四、位运算实现乘法

代码语言:javascript
复制
public static void main(String[] args) { 

int a = 1;
int b = 3;
System.out.println(a * b);
}
在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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));
}
在这里插入图片描述
在这里插入图片描述

四、位运算实现除法

代码语言:javascript
复制
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,以此循环倒推即可.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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));
}
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/226772.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、常见位运算
    • 1. &运算
      • 2. |运算
        • 3. ^运算
          • 4. ~运算
          • 二、位运算实现加法
          • 三、位运算实现减法
          • 四、位运算实现乘法
          • 四、位运算实现除法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档