博客
关于我
【leetcode】 两整数之和, 不用+-号,如何实现两数相加
阅读量:547 次
发布时间:2019-03-09

本文共 2760 字,大约阅读时间需要 9 分钟。

Adding Two Integers Without Using '+' or '-' Operators

Adding two integers without using the '+' or '-' operators can be achieved using bitwise operations. The approach leverages the properties of the XOR and AND operators to simulate the addition process. Here's a detailed explanation of the method and a Python implementation.


Conceptual Understanding

In binary addition, each bit is processed from the least significant bit (LSB) to the most significant bit (MSB). When adding two bits:

  • XOR Operation: This gives the sum of the bits without considering carry.
  • AND Operation: This identifies positions where a carry is generated, which is then left-shifted to the next higher bit.
  • By iteratively applying these operations, the process continues until there are no more carries to propagate.


    Algorithm and Code

    def get_sum(a, b):    while (a & b) != 0:        shift = a & b        carry = shift << 1        a = a ^ b        b = carry    return a ^ b

    Step-by-Step Explanation:

  • Loop Until No Carry Exists:

    • The loop continues as long as there is a carry (i.e., a & b is not zero).
  • Calculate Current Bit Sum (XOR):

    • a ^ b computes the sum of the current bits without carry.
  • Calculate Next Carry (AND then Shift Left):

    • shift = a & b identifies bits where both a and b have a 1 (indicating a carry to the next higher bit).
    • carry = shift << 1 propagates the carry to the next higher bit.
  • Update a and b for Next Iteration:

    • a = a ^ b holds the current bit sum.
    • b = carry prepares the carry for the next iteration.
  • Termination:

    • When a & b becomes zero, there are no more carries, and the loop exits.
  • Return Result:

    • The final result is a ^ b, which now includes all the carries.

  • Example Demos

    Example 1:

    • Input: a = 1, b = 2
    • Binary: a = 01, b = 10
    • Iteration 1: XOR = 11 (3), AND = 01 → Shift left → carry = 10
    • Next values: a = 11, b = 10
    • Iteration 2: XOR = 01, AND = 10 → Shift left → carry = 100
    • Next values: a = 01, b = 100
    • Loop terminates (a & b = 000).
    • Result: 3.

    Example 2:

    • Input: a = -2, b = 3
    • Binary (assuming infinite bits for -2): ...1110 (a), 0000...0011 (b)
    • Iterations simulate correct handling of carry and signs, resulting in sum 1.

    Considerations and Limitations

    • Negative Numbers: The algorithm works for negative numbers in Python due to its arbitrary-precision integers.
    • Time Complexity: The algorithm processes each bit individually, leading to O(log n) time complexity.
    • Overflow: For languages with fixed-size integers, overflow may cause issues, but Python handles this seamlessly.

    Conclusion

    This method elegantly demonstrates how bitwise operations can be used to perform addition without using the '+' operator. By using XOR to sum bits and AND followed by a left shift to handle carries, the algorithm efficiently computes the sum of two integers.

    转载地址:http://qxhiz.baihongyu.com/

    你可能感兴趣的文章
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>