• 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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    2. |运算

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

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

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

    3. ^运算

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

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

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

    4. ~运算

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

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

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

    二、位运算实现加法

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

    在这里插入图片描述
    下来我们用位运算实现一下加法.
    在这里插入图片描述
    我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.
    在这里插入图片描述
    进行一次与运算,只有同时为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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    三、位运算实现减法

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

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

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

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

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

    在这里插入图片描述

    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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    四、位运算实现乘法

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

    在这里插入图片描述
    我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.
    在这里插入图片描述
    二进制中也是一样的,按位相乘,如果被乘数二进制位是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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    四、位运算实现除法

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

    在这里插入图片描述
    我们在用位运算实现除法时,采用逆推的方式,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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

  • 相关阅读:
    软考软件设计师基础知识—法律法规知识
    互融云借条APP系统开发 六大系统优势全面保障
    nginx php-fpm swoole
    Python error:Compressed file ended before the end-of-stream marker was reached
    UE5蓝图-事件、函数、事件分发器
    Boosting以及代表算法(Adaboost、GBDT)介绍
    机试:偶数分解
    尚医通gateway配置bug
    一篇文章说清 webpack、vite、vue-cli、create-vue 的区别
    沪深A股上市公司创新投资数据(2007-2018年)
  • 原文地址:https://blog.csdn.net/buhuisuanfa/article/details/126561132