《剑指offer》面试题65:不用加减乘除做加法

题目:不用加减乘除做加法

写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。
思路:

不能用四则运算,那只能通过位运算了。其实四则运算是针对十进制,位运算是针对二进制,都能用于运算。下面以0011(即3)与0101(即5)相加为例说明

1.两数进行异或:  0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合
2.两数进行与:    0011&0101=0001 这个数字为1的位置表示需要进位,而进位动作是需要向前一位进位
3.左移一位:      0001<<1=0010

此时我们就完成0011 + 0101 = 0110 + 0010的转换

如此转换下去,直到其中一个数字为0时,另一个数字就是原来的两个数字的和

基于以上思路,java参考代码如下:

package chapter6;

public class P310_AddTwoNumbers {
    //三步走:第一步,只做各位相加不进位;第二步,做进位;第三布,把前面两个结果加起来(涉及重复前面的步骤)。
    public static int add(int num1,int num2){
        int sum,carry;
        do{
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }while (num2!=0);

        return num1;
    }
    public static void main(String[] args){
        System.out.println(add(3,5)); //8
        System.out.println(add(3,-5)); //-2
        System.out.println(add(0,1));  //1
    }
}
测试用例:

a.输入正数、负数和0。

相关问题:

1.不使用新的变量,交换两个变量的值。比如有两个变量a、b,我们希望交换它们的值。有两种不同的方法:基于加减法(a=a+b;b=a-b;b=a-b;);基于异或运算(a=a^b; b=a^b; a=a^b;)。
2.[LeetCode] 2.Add Two Numbers 两个数字相加

参考:

https://www.jianshu.com/p/e1e77b010ecc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值