Leetcode-刷题-190825-位运算模拟加法

mac2024-04-20  41

题目描述

题目地址

题目要求不使用加号减号完成加法。考点是位运算中如何模拟加法,在此记录一下。

思路

两个整数的异或运算可以得到结果的无进位结果,例如:$4 + 5 = 9 , 4 = (0100)_2 , 5 = (0101)_2 , (0100)_2 \oplus (0101)_2 = (0001)_2$。

接着使用与运算得到整数加法中的进位情况,回忆与运算的性质,只有1 & 1 = 1,和二进制加法进位的情况相同。$4 = (0100)_2 , 5 = (0101)_2 , (0100)_2 \& (0101)_2 = (0100)_2$结果表示为1的那位需要进位,但是进位时我们需要把为1的那位的下一位加1,所以这个结果还要左移动1位,之后在与我们的异或后的无进位结果相加即可。当然,这里的相加也是二进制相加。即进行递归操作,由于无进位时与操作总是得到0,而异或有任何数异或0都等于任何数的性质。因此我们判断无需再进位时即可退出递归。

实现

12345678910111213141516171819class Solution { public int getSum(int a, int b) { // 无需再进位,即可退出 if (b == 0) { return a; } else { // 进位结果 int t = (a & b) << 1; // 无进位加法结果 int sl = a ^ b; // 两数继续运算 return getSum(sl, t); } }}
最新回复(0)