#数据结构与算法学习笔记#剑指Offer46:不用加减乘除做加法(Java、C/C++)

234 篇文章 1 订阅
80 篇文章 0 订阅

2019.1.22     《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门​​​​​​​

这道题主要是练一个常识:用位运算实现加减法。

异或(^)可以实现无进位相加的结果,与(&)可以表示进位的数位。实现进位加法时,只要将进位值右移一位与异或值相加即可,若再次产生进位,则再次相加。

例如2+3(0010+0011),异或值(0010^0011=0001),进位值(0010&0011=0010),进位值右移并与异或值相加(0100^0001=0101)结果为5。

如果没有见过直接记住即可,相当于基础知识。


题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。


Java实现:

/**
 * 
 * @author ChopinXBP
 * 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
 *
 */

public class Add_47 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Add(2, 3));
	}
	
	//x^y执行加法,(x&y)<<1进位操作
	//x+y = x^y + (x&y)<<1
    public static int Add(int num1,int num2) {
    	int loc = num1 ^ num2;				//相加数位值
    	int bit = (num1 & num2) << 1;		//进位值
    	while(bit != 0) {
    		int carrybit = (loc & bit) << 1;
    		loc = loc ^ bit;
    		bit = carrybit;
    	}
    	return loc;
    }

}

C++实现示例: 

class Solution {
public:
    int Add(int num1, int num2)
    { 
        return num2 ? Add(num1^num2, (num1&num2)<<1) : num1;
    }
};

#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值