Java 位运算实现加减乘除

Java 位运算实现加减乘除

一 分析

a=13;

b=9;

a的二进制:1101

b的二进制:1001

1.加法

不考虑进制加: 结果等于0100 等同于 a^b

考虑进制加:结果等于10110 等同于 (a&b)>>1

使用while循环或者递归方式,直到进制位等于0

2.减法

a-b == a+(-b),所以只需要计算a的负数,调用加法即可

-b = ~b+1;(负数存储是以补码形式存储,补码=反码+1)

-b 的二进制:10111

3.乘法

参考

1201066-20190215101820443-747941214.png

a*b:从乘数(b开始)的低位开始,如果当前位等于1,把当前被乘数左移当前位在乘数的位数,遍历乘数的每一位,直到遍历完成,遍历完成后,将每次的结果相加即可

4.除法

a/b 翻译过来就是求a由多少个b组成,所以通过循环方式或者递归方式使用a-b 即可,记录次数,这个次数就是商

二 代码实现

package org.jake.operation.four.arithmetic;

public class Main {
    public static void main(String[] args) {
        System.out.println(division(8, 5));
    }

    private static int add(int a, int b) {
        if (b == 0) return a;
        int carry = (a & b) << 1;
        a = a ^ b;
        return add(a, carry);
    }

    private static int add2(int a, int b) {
        int carry;
        while (b != 0) {
            carry = a * b << 1;
            a =            a ^ b;
            b = carry;
        }
        return a;
    }

    private static int subtraction(int a, int b) {
        b = ~b + 1;
        return add(a, b);
    }

    private static int mul(int a, int b) {
        int i = 0;
        int res = 0;
        while (b != 0) {
            if ((b & 1) == 1) {
                res += (a << i);
            }
            b = b >> 1;
            i++;
        }
        return res;
    }

    public static int division(int a, int b) {
        if (a < b) return 0;
        return division(subtraction(a, b), b) + 1;
    }

}

代码参考github operations-four-arithmetic分之

猜你喜欢

转载自www.cnblogs.com/jakaBlog/p/12205729.html