力扣对应题目链接:LCR 190. 加密运算 - 力扣(LeetCode)
牛客对应题目链接:不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)
一、《剑指Offer》对应内容
二、分析题目
- sum=dataA⊕dataB 非进位和:异或运算
- carry=dataA & dataB<<1 进位:与运算+左移一位
如果数字 dataA 和 dataB 中有负数,则变成了减法,那应该如何处理呢?
在计算机系统中,数值一律用补码来表示和存储。
补码的优势:加减法可以统一处理(CPU 只有加法器)。因此,以上方法同时适用于正数和负数的加法。
三、代码
//力扣
class Solution {
public:int encryptionCalculate(int dataA, int dataB) {while(dataB){int sum=dataA^dataB;int carry=(dataA&dataB)<<1;dataA=sum;dataB=carry;}return dataA;}
};//牛客
class Solution {
public:int Add(int num1, int num2) {while(num2){int sum=num1^num2;int carry=(num1&num2)<<1;num1=sum;num2=carry;}return num1;}
};
四、相关问题
不使用新的变量,交换两个变量的值。比如有两个变量 a、b,我们希望交换它们的值。有两种不同的方法:
1、基于加减法
a = a + b;b = a - b;a = a - b;
2、基于异或运算
a = a ^ b;b = a ^ b;a = a ^ b;