码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 不使用加法计算两个数的和


    一、前置知识

    为了能够快速的理解最后的算法,这里先准备一些前置知识。这些所谓的前置知识可以理解为“点”,最后只要把这些“点”串联为“线”,就会得到最终的答案。

    1. a ^ b的含义

    首先探索一下在二进制中a^b的结果,然后给这个结果加一个定义。

    (1)穷举实例

    0 ^ 0 = 0
    1 ^ 1 = 0
    0 ^ 1 = 1
    1 ^ 0 = 1

    根据异或运算的运算规则,对于某个二进制位上的两个数,如果这两个数同为0或者1那么异或的结果一定为0,否则异或的结果为1。
    将异或运算和加法运算对比一下,得到如下的结果。

    0 ^ 0 = 0 c 0 + 0 = 0
    1 ^ 1 = 0 --------------------- 1 + 1 = 1 0
    0 ^ 1 = 1 --------------------- 0 + 1 = 1
    1 ^ 0 = 1 --------------------- 1 + 0 = 1

    (2)结论

    两个数a和b进行异或运算,在二进制角度,相当于对每对对应的bit位做了不进位的加法运算。

    2. a & b的含义

    (1)穷举实例

    0 & 0 = 0
    0 & 1 = 0
    1 & 0 = 0
    1 & 1 = 1

    根于与运算的运算规则,对于某个二进制位上的两个数,如果这两个数都为1时得到的结果为1,否则得到的结果为0。
    将与运算和加法运算对比一下,得到如下的结果。

    0 & 0 = 0 --------------------- 0 + 0 = 0 进位值为0
    0 & 1 = 0 --------------------- 0 + 1 = 1 进位值为0
    1 & 0 = 0 --------------------- 1 + 0 = 1 进位值为0
    1 & 1 = 1 --------------------- 1 + 1 = 1 0 进位值为1 、

    (2)结论

    两个数a和b进行异或运算,在二进制角度,相当于记录了每对对应的bit位进行加法运算以后所产生的进位。

    (3)<< 位移

    (2)中的结果将产生的进位记录在了运算的位置上,那么如果将整体左移1位,那么恰好就是把进位值移动到了应该被进到的位置上。

    二、 连点成线

    有了一种的前置知识以后,就可以按照如下的步骤来计算两个数的和了。这里设两个数为a 和 b。会得到如下的计算步骤。

    • 把二进制的每一位都进行不进位的加法。
    • 获取到每个bit位向上的进位值。
    • 继续进行不进位的加法。
    • 获取到每个bit位向上的进位值。
    • 继续进行不进位的加法。
    • …

    三、代码

    public int getSum(int a, int b) {
            while (b != 0) {
                int m = (a & b) << 1;
                a = a ^ b;
                b = m;
            }
            return a;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    不是吧,还有人连Java最强大的技术之一:反射还没搞懂?赶紧码住
    web前端面试高频考点——Vue的基本使用(一文掌握Vue最基础的知识点)
    Jmeter 自动化性能测试常见问题汇总
    深度剖析NIKE Web3平台:为什么Web3对品牌很重要?
    详细讲解修改allure报告自定义的logo和名称中文
    RPA除了和OCR、NLP技术结合,还能和什么技术结合?
    器利而工善,以RPA+LCAP赋能企业司库管理数字化升级
    SSM+springboot+vue+java企业公寓员工宿舍后勤管理网站
    深度学习100例——卷积神经网络(CNN)实现服装图像分类
    全面了解 Redis 高级特性,实现高性能、高可靠的数据存储和处理
  • 原文地址:https://blog.csdn.net/u012613903/article/details/127572740
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号