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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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

在这里插入图片描述

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

前言

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


一、常见位运算

1. &运算

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

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

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));
    }

在这里插入图片描述

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Tensor 和Numpy转换

    Tensor 和Numpy转换Tensor转Numpyimporttorchastimportnumpyasnpa=t.ones(5)aOut[23]:tensor([1.,1.,1.,1.,1.])b=a.numpy()#Tensor->NumpybOut[25]:array([1.,1.,1.,1.,1.],dtype=float32)Numpy转Tensorimporttorchastimportnumpyasnp..

    2022年10月18日
  • 软件需求规格说明书范例

    完整版(包括图片表格,请访问http://www.omegaxyz.com/2019/07/23/software-specification/)文章目录一、引言1.1定位与目标1.2对象1.3软件需求分析理论1.4软件需求分析目标二、需求概述2.1项目背景2.2需求概述2.3系统结构三、系统功能需求3.1功能总览3.2业务流程图3.3数据流…

  • 文件路径超过系统限制_linux文件名长度限制

    文件路径超过系统限制_linux文件名长度限制Linux在Linux系统下,可以查看limits.h头文件里面有针对NAME和PATH的最大长度限制:#ifndef_LINUX_LIMITS_H#define_LINUX_LIMITS_H……#defineNAME_MAX255 /*#charsinafilename*/#definePATH_MAX4096 /*#charsinapathnameincludingnul*/……#en

  • Gamma 校正_gamma校正什么意思

    Gamma 校正_gamma校正什么意思问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思?      Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、打印机等输入、输出设备中这是一个相当常见并且比较重

  • Android数据库加密

    Android数据库加密Android数据库加密一、简介SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如Android、iOS)。Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,具体就不详细说明了。然而,Android平台自带的SQLite有一个致命的缺陷:…

  • forkjoinpool 弊端_oracle数据库分页查询sql

    forkjoinpool 弊端_oracle数据库分页查询sql使用forkjoin框架分页查询所有数据的例子importio.swagger.annotations.ApiOperation;importlombok.AllArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.PropertySou

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号