title: 每日一練(34):不用加減乘除做加法
categories:[劍指offer]
tags:[每日一練]
date: 2022/03/09
每日一練(34):不用加減乘除做加法
寫一個函式,求兩個整數之和,要求在函式體內不得使用 “+”、“-”、“*”、“/” 四則運算子號。
示例:
輸入: a = 1, b = 1
輸出: 2
提示:
a, b 均可能是負數或 0
結果不會溢位 32 位整數
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
方法一:位運算
演算法流程:
a ^ b 計算出2個加數二進位制下每一位的本位
a & b 計算出2個加數二進位制下每一位的進位
(a & b) << 1 進位做進位邏輯,也就是 * 2
int add(int a, int b) {
while (b != 0) {
int carry = a & b ; // 計算 進位
a ^= b; // 計算 本位
b = (unsigned)c << 1;
}
return a;
}
方法二:遞迴
加法=進位+非進位部分
利用異或位運算來表示不進位的情況 00=0 11=0 10=1 01=1
利用與運算和左移運算來表示進位的情況 11=10
在迴圈中也要進行左移操作
int add(int a, int b) {
// 後續用a表示非進位和,b表示進位,當進位為0,則表示計算結束
return b ? add(a ^ b, (unsigned)(a & b) << 1) : a;
}