这篇文章给大家分享的是有关LeetCode中如何不用加减乘除做加法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
与
可以用来计算进位, 而且显然进位是要左移一位的异或
在两个数字都为 1 或者都为 0 的情况下结果是 0, 否则结果是 1, 换言之
异或就是不带进位的加法a+b
转换成
((a&b)<<1)+(a^b)
, 虽然这里仍然有加号, 但是我们将其置为新的 a 和 b, 循环这个过程, 直到进位变成 0, 这样最终异或结果就是两者之和了&0xFFFFFFFF
, 正数仍为自身, 负数相当于 32 位补码形式, 因为去掉了更高位上的 1), 然后利用上述结果求完之后, 如果结果是负数(
>0x7FFFFFFF
)的话再转成正常的 python 负数表示方式(
~(a ^ 0xFFFFFFFF)
, 即先对低 32 位的取反, 更高位不变, 然后整体再取反, 从而将大于等于 32 位的数字重新转成 1)class Solution:
def add(self, a: int, b: int) -> int:
# 32位数掩码
mask = 0XFFFFFFFF
# 32位数的最大正数
posMx = 0X7FFFFFFF
while b != 0:
# a是不带进位的和, 都要转成32位整数
# b是进位, 都要转成32位整数
# 循环直到进位为0, 那么a就是最终结果
smwithoutcarry = (a ^ b) & mask
carry = ((a & b) << 1) & mask
a, b = smwithoutcarry, carry
# 最终如果是32位负数的话, 需要将其转回python正常的负数表示形式(高于32位的全是1, 而不是32位负数那样更高位全为0), 做法是先对低 32 位的取反, 更高位不变, 然后整体再取反, 从而将大于等于 32 位的数字重新转成 1
return a if a <= posMx else ~(a ^ mask)
class Solution {
public int add(int a, int b) {
while (b != 0)
{
int smwithoutcarry = a ^ b;
int carry = (a & b) << 1;
a = smwithoutcarry;
b = carry;
}
return a;
}
}
感谢各位的阅读!关于“LeetCode中如何不用加减乘除做加法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。