只用位运算实现两数相加(考虑负数)

只用位运算实现两数相加(考虑负数)

//整个程序没有出现+ - * /
import java.util.*;
public class Solution {
    public static int Add(int num1,int num2) {
        int bit1 = 0;
        int bit2 = 0;
        int tmp = 0;//当前位计算结果
        int forward = 0;//进位记录
        ArrayList<Integer> ret = new ArrayList<>();//list记录每一位
        while(num1!=0&&num2!=0){
            bit1 = num1 & 1;
            bit2 = num2 & 1;
            if(bit1==1&&bit2==1){
                tmp = forward;//当前位等于上一位的进位
                forward = 1;
            }else if((bit1==1||bit2==1)){
                if(forward==1){
                    tmp = 0;
                    forward = 1;
                }else{
                    tmp = 1;
                    forward = 0;
                }
            }else{//bit1==0,bit2==0
                tmp = forward;
                forward = 0;
            }
            ret.add(tmp);
            num1 >>>=1;//这里一定要用不带符号位的右移否则跳不出循环的!
            num2 >>>=1;
        }
        //剩余位处理,还有进位要处理的
        if(num1!=0){
            while(num1!=0){
                bit1 = num1&1;
                if(bit1==1&&forward==1){
                    tmp=0;
                    forward = 1;
                }else{
                    tmp = bit1 | forward;
                    forward = 0;
                }
                ret.add(tmp);
                num1 >>>=1;
            }
        }
        if(num2!=0){
            while(num2!=0){
                bit2 = num2&1;
                if(bit2==1&&forward==1){
                    tmp=0;
                    forward = 1;
                }else{
                    tmp = bit2 | forward;
                    forward = 0;
                }
                ret.add(tmp);
                num2>>>=1;
            }
        }
        if(forward == 1){
            ret.add(1);
        }
        Collections.reverse(ret);//翻转list方便移位还原整数;
        int ans = 0;
        for(Integer i : ret){
            ans <<=1;
            ans |= i;
        }
        return ans;
    }
}
//简洁版本
public class Solution {
    public int Add(int num1,int num2) {
        int and = (num1&num2)<<1;//相与为1的位是需要进位的,所以直接左移一位
        int or = num1^num2;//异或为1的位是一定等于1的位
        while((and&or)!=0){//进完位的位,与异或为1的位相加需不需要进位?需要就继续循环,不需要就加完啦~
            int tmp1 = and;
            int tmp2 = or;
            and = (tmp1&tmp2)<<1;
            or = tmp1^tmp2;
        }
        return and|or;//最后返回不需要进位的and|or的值,即他们的和,这里用异或也行啊,这里用^或者|都行,但是^更快
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值