Java——位运算实现加减乘除

本文详细介绍了位运算在加法、减法、乘法和除法中的实现,通过递归和非递归方式展示了如何使用位运算进行高效计算。例如,加法通过异或操作处理不进位和左移操作处理进位;减法转化为加法结合补码概念;乘法通过逐位判断乘数的1来累加被乘数的左移值;除法则通过不断做减法来求解。这些算法展示了位运算在数值计算中的强大能力。
摘要由CSDN通过智能技术生成

转载于:https://www.cnblogs.com/zsh-blogs/p/10382219.html

在这里插入图片描述
位运算参考博客:https://blog.csdn.net/xiaochunyong/article/details/7748713

1 加法

a+b

举例实现:13+9=22

  • 13+9不考虑进位,结果为12
  • 13+9只考虑进位,结果为10
  • 12+10和刚好是22
  • 13二进制为11019二进制为1001
  • 不考虑进位结果为0100,算式为a^b
  • 只考虑进位结果为10010,算式为(a&b)<<1
  • 然后它俩继续进行运算,直到进位为0

算法实现:
1、递归形式实现

int add(int a ,int b){
    if (b == 0)
        return a;
    else{
        //进位值
        int carry = (a & b) << 1;
        a = a^b;
        return add(a,carry);
    }
}

2、非递归形式实现

int add2(int a ,int b){
    //进位值
    int carry;
    while (b != 0){
        carry = (a & b) << 1;
        a = a^b;
        b = carry;
    }
    return a;
}

2 减法

a-b

Java负数存储是以补码形式存储的补码=反码+1。所以反码=补码-1~n=-n-1=-(n+1)

所以a-b可以化简为a+(-b)=a+~b+1

算法实现:

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

3 乘法

a*b

举例说明:
在这里插入图片描述
可以看到,二进制乘法的原理是:从乘数的低位到高位,遇到1并且这个1在乘数的右起第i(i从0开始数)位,那么就把被乘数左移i位得到 temp_i 。直到乘数中的1遍历完后,把根据各位1而得到的被乘数的左移值们 temp_i 相加起来即得乘法结果。那么根据这个原理,可以得到实现代码:这里要点为:用i记录当前遍历的乘数位,当前位为1则被乘数左移i位并加到和中,同时i++处理下一位;为0则乘数右移,i++,处理下一位…直到乘数==0说明乘数中的1遍历完了。此时把和返回即可。

//乘法实现
    //a 被乘数,b 乘数
    int multiplication(int a,int b){
        int i = 0;
        int res = 0;
        //乘数不为0
        while (b != 0){
            //处理当前位
            //当前位是1
            if ((b & 1) == 1){
                res += (a << i);
                b = b >> 1;
                //记录当前是第几位
                i++;
            }else {
                //当前位是0
                b = b >> 1;
                i++;
            }
        }
        return res;
    }

4 除法

a/b

除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。

//除法实现
    int division(int a,int b){
        int res;
        if(a<b){
            return 0;
        }else{
            res=division(subtraction(a, b), b)+1;
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值