另类加法(牛客)(Java语言)

另类加法

题目

给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。

测试样例:

输入:1,2

返回:3

解题

题目思路:

  1. 如果不进位两个二进制数异或的结果,等于两个二进制数相加的结果。
    异或:0 ^ 0 = 0, 1 ^ 0 = 1, 1 ^ 1 = 0;
    相加:0 + 0 = 0, 1 + 0 = 1, 1 + 1 = 0;

  2. 二进制进位的结果等于两个二进制数的与的结果。
    相与:0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 1;
    进位:0+0(不进位),1+0(不进位), 1+1(进位);

举例:2 + 3

xor = 0010 ^ 0011 = 0001; 两个数相加不考虑进位
and = 0010 & 0011 = 0010; 判断是否进位
and = and << 1 = 0100; 如果要进位,进位的值要给下一位
xor + and ;所以最终的值是异或的结果 + 进位的值,这里又是加法,所以重复上述步骤(使用循环)
xor ^ and = 0101;
xor & and = 0000; 在这其中判断进位的数是0,循环的终止条件。
最终的结果就是 0101(二进制) = 5(十进制)

代码

import java.util.*;

public class UnusualAdd {
    public int addAB(int A, int B) {
        // write code here
        int xor, and;
        while(B != 0){   //判断进位数是为零
            xor = A ^ B;   //两个数相加不考虑进位
            and = A & B;   //判断是否进位
            A = xor;
            B = and << 1;
        }
        return A;
    }
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术博主-方兴未艾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值