Skip to content

Latest commit

 

History

History
38 lines (30 loc) · 1.05 KB

65.md

File metadata and controls

38 lines (30 loc) · 1.05 KB

不用加减乘除做加法

题目

  • 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
  • 数据范围:两个数都满足 −10≤n≤1000
  • 进阶:空间复杂度 O(1),时间复杂度 O(1)

示例

  • 输入:1,2
  • 返回值:3

思路

  • 计算机中存整数n是用补码存的
  • 如果n为正数,则原码=反码=补码
  • 如果n为负数,则补码=反码+1
  • 补码就是解决减法的问题,计算机把减法看做加法来运算

实现

func Add(num1 int, num2 int) int {
	/*
		num2 初始如果等于 0,那么结果就是 num1
		进入循环后,就是进位的值,进位的值为 0 了,加法结束了
	*/
	for num2 != 0 {
		// 相加各位的值,不算进位,就相当于各位做异或操作
		tmp := num1 ^ num2
		// 计算进位值,相当于各位做与操作后,再向左移一位得到
		num2 = (num1 & num2) << 1 // num2 被当做放进位的容器
		num1 = tmp                // num1 被当做放相加各位的值的容器
	}
	return num1
}