java用位运算实现加减乘除

图片[1] - java用位运算实现加减乘除 - MaxSSL

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

文章目录

  • 前言
  • 一、常见位运算
    • 1. &运算
    • 2. |运算
    • 3. ^运算
    • 4. ~运算
  • 二、位运算实现加法
  • 三、位运算实现减法
  • 四、位运算实现乘法
  • 四、位运算实现除法

前言

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


一、常见位运算

1. &运算

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

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

图片[2] - java用位运算实现加减乘除 - MaxSSL
图片[3] - java用位运算实现加减乘除 - MaxSSL

2. |运算

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

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

图片[4] - java用位运算实现加减乘除 - MaxSSL
图片[5] - java用位运算实现加减乘除 - MaxSSL

3. ^运算

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

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

图片[6] - java用位运算实现加减乘除 - MaxSSL
图片[7] - java用位运算实现加减乘除 - MaxSSL

4. ~运算

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

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

图片[8] - java用位运算实现加减乘除 - MaxSSL
图片[9] - java用位运算实现加减乘除 - MaxSSL

二、位运算实现加法

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

图片[10] - java用位运算实现加减乘除 - MaxSSL
下来我们用位运算实现一下加法.
图片[11] - java用位运算实现加减乘除 - MaxSSL
我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.
图片[12] - java用位运算实现加减乘除 - MaxSSL
进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.
图片[13] - java用位运算实现加减乘除 - MaxSSL
我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为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));    }

图片[14] - java用位运算实现加减乘除 - MaxSSL

三、位运算实现减法

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

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

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

图片[17] - java用位运算实现加减乘除 - MaxSSL
我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.

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

图片[18] - java用位运算实现加减乘除 - MaxSSL

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

图片[19] - java用位运算实现加减乘除 - MaxSSL

四、位运算实现乘法

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

图片[20] - java用位运算实现加减乘除 - MaxSSL
我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.
图片[21] - java用位运算实现加减乘除 - MaxSSL
二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位
图片[22] - java用位运算实现加减乘除 - MaxSSL

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

图片[23] - java用位运算实现加减乘除 - MaxSSL

四、位运算实现除法

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

图片[24] - java用位运算实现加减乘除 - MaxSSL
我们在用位运算实现除法时,采用逆推的方式,a / b = c,
a = c * b。

图片[25] - java用位运算实现加减乘除 - MaxSSL
我们只需要求出a减去b向左的移位,只要满足a <= b的移位即可,每次移动多少位即a / b的结果二进制中某一位为1,以此循环倒推即可.

图片[26] - java用位运算实现加减乘除 - MaxSSL
图片[27] - java用位运算实现加减乘除 - MaxSSL

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) " />

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享