二进制实现加法_递归实现十进制转换二进制

二进制实现加法_递归实现十进制转换二进制一、原理1、化简先看一个例子:看一下3+4的加法运算3的二进制表示:0114的二进制表示:1003^4(3按位异或4)的结果是:111=>7上面的到的结果是


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、原理

  

  1、化简

    先看一个例子:
    看一下 3 + 4 的加法运算

    3 的二进制表示: 011
    4 的二进制表示: 100

    3^4 (3按位异或4)的结果是: 111 => 7
    上面的到的结果是就是 3 + 4 的实际结果

    再看一个例子:

    12 的二级制表示:  01100
    19 的二进制表示:  10011

    12^19 的结果是: 11111 => 31

    再看一个例子:
    13 的二进制表示:01101
    19 的二进制表示:10011

    13^19 的结果是: 11110 => 20

    通过上面的三个例子不难发现: 当二进制数的每一位加法中不发生进位时,按位异或的结果就是最终的加法结果,那么我需要做的就是将所有的加法操作最终都简化成没有进位的加法操作,最终的结果就是两个数按位异或的结果。

  2、怎么处理有进位的加法?

    拆分
      将两个数的加法拆分为 进位加法和不进位加法

    看一个例子:

    编号:1 2 3 4 5
        ————————
       1 0 0 1 1 => 19
      +  1 1 0 1 0 => 26
     ————————–

    先求只有不进位的两个位相加的值,编号为2、3、5这三位的加法不发生进位操作,需要进位的相加位数直接按照结果为0处理,得到的结果为

    编号:1 2 3 4 5

        ————————
          1 0 0 1 1
       + 1 1 0 1 0
         ————————
   不进位: 0 1 0 0 1

           进位两个位相加的值,编号为1、4这三位的加法会发生进位操作,不需要进位的直接按照结果0处理,得到的结果为:

      编号:1 2 3 4 5
          ————————
            1 0 0 1 1
         + 1 1 0 1 0
          ————————
      不进位:   0 1 0 0 1
      进   位: 1 0 0 1 0 0

    再将两个结果按位异或:
      不进位:0 0 1 0 0 1
      进    位:1 0 0 1 0 0
          ————————
           1 0 1 1 0 1 => 45

    由此可见可以将一个二进制加法拆分为有进位的位数相加结果 和 无进位的位数相加的结果最终按位异或

  3、递归

    再看一个例子

    编号:1 2 3 4 5
        ————————

          1 0 1 1 1 => 23
       + 1 1 0 1 1 => 27
        ————————

    不进位:   0 1 1 0 0 => 12
    进   位: 1 0 0 1 1 0 => 38

    通过一次相加得到的结果不能完全实现化简操作,所以需要递归地进行化简操作

    编号:1 2 3 4 5
        ————————

          1 0 1 1 1 => 23
       + 1 1 0 1 1 => 27
        ————————

   不进位: 0 0 1 1 0 0 => 12
      进    位:1 0 0 1 1 0 => 38
        ————————

    不进位:1 0 1 0 1 0 => 42
    进    位:0 0 1 0 0 0 => 8
        ————————

     不进位:1 0 0 0 1 0 => 34
     进    位:0 1 0 0 0 0 => 16
        ————————

    不进位:1 1 0 0 1 0 => 50
    进    位:0 0 0 0 0 0 => 0

    以上实例通过递归的方式可以得到最终的结果

二、位运算实现

  通过以上几个实例我们明白了如何通过二进制的几个步骤来实现任意整数的加法操作,现在我们需要把这件事情用位运算进行表示。

  位运算表示不进位加法:
    不进位加法其实就是一个异或操作
  位运算表示进位加法:
    进位加法其实就是一个与操作的结果左移一位

三、代码实现

  js实现:

function sum (a, b) {
    if (b===0) return a;
    return sum(a^b, (a&b)<<1)
}

  java实现:

  

public int sum(int a, int b) {
    if (b==0) return a;
    return sum(a^b, (a&b)<<1);
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168378.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • linux查看java进程内存使用情况_java查看线程状态

    linux查看java进程内存使用情况_java查看线程状态1.查看java进程内存占用top-b-n1|grepjava|awk'{print”PID:”$1″,mem:”$6″,CPUpercent:”$9″%”,”mempercent:”$10″%”}’2.查看pid所在目录lsof-pPID3.查看剩余内存free-m

    2022年8月24日
  • Jenkins配置Coding Webhook

    Jenkins配置Coding WebhookJenkins配置CodingWebhook1.安装插件2.创建项目3.Coding设置ServiceHook1.安装插件需要重启Jenkins2.创建项目这里选择自由风格添加git注意:WebHook地址是你http://jenkins地址/coding/项目名设置运行脚本3.Coding设置ServiceHook使用CodingWebhookPlugin过时问题.使用插件后无法保存配置文件

    2022年5月5日
  • 英语考研词汇[通俗易懂]

    英语考研词汇[通俗易懂]1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将在后方产一头可爱的小崽.3.EarlyIsearchedt

    2022年5月12日
  • IPaddr和IPaddr2的区别「建议收藏」

    IPaddr和IPaddr2的区别「建议收藏」Heartbeat资源配置中IPaddr和IPaddr2的区别:其主要的区别在于:IPaddr支持LVS,而IPaddr2则和LVS有冲突。参考:redflagLinux集群管理手册。 转载于:https://blog.51cto.com/dangzhiqiang/1397425…

    2022年7月27日
  • ETL工具-Kettle Spoon教程

    ETL工具-Kettle Spoon教程一。KettleSpoon简介   ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,了解并掌握一种etl工具的使用,必不可少,支持图形化的GUI设计界面,然后可以以工作流的形式流转,在做一些简单或复杂的数据抽取、质量检测、数据清洗、数据转换、数据过滤等方面有着比较稳定的表现,使…

    2022年5月23日
  • vs2019配置opengl环境_vs2010配置opengl

    vs2019配置opengl环境_vs2010配置opengl这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年10月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号