题解 | #不用加减乘除做加法#

不用加减乘除做加法

https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215

基本原理:加法是线性算子;加法和异或运算逻辑类似,进位和与运算逻辑类似。

基本公式:a + b = a ^ b + a & b。
先不考虑进位,直接异或,之后再把进位的结果加上。
因为是线性算子,所以这是合理的。

循环终止条件:进位为0,即,不进位的情况下,加法 = 异或。

python需要考虑的事情:

  • python是没有变量长度之分的。python对负数作位运算需要提前截断掉高位,否则会超时/越界。

  • python最大的正整数的补码是0x7FFFFFFF(可自行通过max_value = sys.maxsize获取),更大数就要以2^30为基分开存储尾数啦,不细说。

  • 本题最大正值2000 =0x7D0。取12位足够了,用来截断更高位。

    (当然,也可以取更大点啦。确保最大正值比board低至少一位就行。这样的话如果是负数,高位一定是1,而又因为截断了,所以更高位“是0”,“看起来”就是正数,也就大于最大正值了。所以只要比最大正值大,那就是负数啦。)

class Solution:
    def Add(self, num1: int, num2: int) -> int:
        board = 0xFFF
        num1, num2 = num1 & board, num2 & board

        while num2 != 0:
            num1, num2 = num1 ^ num2, (num1 & num2) << 1 & board

        return num1 if num1 <= 0x7D0 else ~(num1 ^ board)
全部评论

相关推荐

10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务