博客
关于我
剑指offer之不用加减乘除做加法
阅读量:639 次
发布时间:2019-03-14

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

为了求两个整数之和,而不使用+、-、*、/四则运算符,我们可以利用二进制逐位运算的原理。二进制加法中的异或操作(^)可以用来计算每一位的和,而与操作(&)可以用来计算进位。具体来说,逐位相加的结果是异或操作的结果,进位是与操作后的结果左移一位。重复这个过程,直到没有进位为止,最终的数值即为两个整数的和。

例如,对于两个数5(二进制0101)和6(二进制0110),逐位运算如下:

  • 逐位相加,进行异或操作和与操作:

    • bit1:1 ^ 0 = 1,进位bit carry1:0 ^ 1 = 0。
    • bit2:0 ^ 1 = 1,进位bit carry2:1 & 1 = 1,左移后变为10。
    • bit3:1 ^ 1 = 0,进位bit carry3:没有进位。
    • bit4:0 ^ 0 = 0,进位bit carry4:没有进位。
  • 组合结果,得到二进制1011,即十进制11。

  • 基于上述逻辑,我们可以编写如下函数:

    写一个函数,求两个整数之和,不得使用+、-、*、/四则运算符。

    思路:利用二进制逐位运算,通过异或操作求出每位的和,通过与操作和左移得到进位,最终组合得到结果。

    代码实现:

    public class Solution { public int Add(int num1, int num2) { while (num2 != 0) { int sum = num1 ^ num2; num2 = (num1 & num2) << 1; num1 = sum; } return num1; } }

    函数逐步解释如下:

  • 循环条件:当num2不等于0时,继续执行循环。
  • sum = num1 ^ num2:计算当前位的和。
  • 进位计算:使用按位与(&)和左移(<< 1)来计算进位,并将进位加入num2,继续处理。
  • 更新sum(num1):将当前位的sum存入num1,继续下一位的处理。
  • 返回结果:当没有进位时(num2 == 0),返回最终结果。
  • 该方法高效且简洁,有效避免了使用四则运算符,同时保证了函数的性能。

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

    你可能感兴趣的文章
    SQL Server 存储过程
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>
    OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
    查看>>
    OSPF技术连载17:优化OSPF网络性能利器——被动接口!
    查看>>
    OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
    查看>>
    OSPF技术连载19:深入解析OSPF特殊区域
    查看>>
    SQL Server 复制 订阅与发布
    查看>>
    OSPF技术连载20:OSPF 十大LSA类型,太详细了!
    查看>>
    OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
    查看>>
    OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
    查看>>
    OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
    查看>>
    OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
    查看>>