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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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);
}

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何在WinForm中发送HTTP请求

    如何在WinForm中请求发送HTTP手工发送HTTP请求主要是调用System.Net的HttpWebResponse方法手工发送HTTP的GET请求:手工发送HTTP的POST请求转自:

    2021年12月26日
  • Python实现人脸识别「建议收藏」

    Python实现人脸识别「建议收藏」案例分析概述Python在人脸识别方面功能很强大,程序语言简单高效,下面编程实现一下如何实现人脸识别。分别给出实现代码,作为学习和技术交流。Python基础环境准备参见:https://blog.csdn.net/yan_dk/article/details/89528463案例实现打开显示图片importcv2#opencv库#读…

  • Java基础学习笔记总结

    Java基础学习笔记总结Java基础学习笔记一Java介绍Java基础学习笔记二Java基础语法之变量、数据类型Java基础学习笔记三Java基础语法之流程控制语句、循环Java基础学习笔记四Java基础语法之

  • Http请求URL长度限制[通俗易懂]

    Http请求URL长度限制[通俗易懂]http1.1协议原文http1.1协议中对url的长度是不受限制的,协议原文://https://www.ietf.org/rfc/rfc2616.txt3.2.1GeneralSyntax TheHTTPprotocoldoesnotplaceanyapriorilimitonthelengthofaURI.ServersM…

  • sklearn linear regression_auto sklearn

    sklearn linear regression_auto sklearnK折交叉验证:sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)思路:将训练/测试数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个作为训练集,进行n_splits训练和测试,得到n_splits个结果注意点:对于不能均等份的数据集,其前n_sa

  • web版聊天功能简单实现

    web版聊天功能简单实现一、问题核心点:如何找到要发送的人?要完成一个功能我觉得首先要分析该功能的逻辑及技术难点,而不是盲目的直接就撸代码,这样非常浪费时间。个人觉得web版聊天功能没什么实际应用场景,以前看过中国移动好

发表回复

您的电子邮箱地址不会被公开。

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