首页 > 编程语言 >二进制相加算法

二进制相加算法

时间:2023-07-16 22:33:09浏览次数:36  
标签:charAt 48 二进制 相加 算法 flag && append

本文主要写二进制相加

(<font color = 'gray'>二进制相加</font>)

二进制相加

二进制相加是一种特殊的加法运算,它只适用于二进制数。在计算机科学中,二进制相加被广泛应用于位运算、逻辑运算和数据存储等方面。 以下是二进制相加的一些作用:

  1. 位运算:二进制相加是位运算中的一种基本运算,它可以用于对二进制数进行位移、掩码操作等。例如,将一个数的各位向左移动一位,可以使用该数与2^n(其中n为向左移动的位数)进行按位异或运算。
  2. 逻辑运算:二进制相加还可以用于逻辑运算中。例如,当两个二进制数相同时,它们的和为0;当两个二进制数不同时,它们的和为1。因此,可以将二进制相加用于判断两个二进制数是否相同。
  3. 数据存储:在计算机中,二进制数据通常以二进制串的形式存储。二进制相加可以用于计算二进制串中的数值,从而实现对数据的读取和处理。

二进制相加的运算原理就是将俩个二进制数相加,得到一个新的二进制数。 俩个二进制数相加有四种情况:

  1. <font color="green">俩个数都为0 即 0+0 =0; </font>
  2. <font color="green">俩个数都为1 即 1+1 = 10;逢二进一
  3. <font color="green">俩个数一个为0一个为1 即0+1 =0 或 1+0 = 1;</font> 熟悉了原理就按照这个逻辑来写代码就可以了。 话不多说上代码
	/**
     * 二进制相加
     * @Author @zzh
     * @Description //TODO
     * @Date 10:16 2023/5/4
     * @param b1
     * @param b2
     * @return java.lang.String
     **/
    public static String add(String b1, String b2) {
        int len1 = b1.length();
        int len2 = b2.length();
        String s1 = b1;
        String s2 = b2;
        StringBuffer sb1 = new StringBuffer();
        //先将位数较少的二进制高位补零
        if (len1 > len2) {
            for (int i = 0; i < (len1 - len2); i++) {
                sb1.append(0);
            }
            sb1.append(b2);
            s1 = b1;
            s2 = sb1.toString();
        } else if (len1 < len2) {
            for (int j = 0; j < (len2 - len1); j++) {
                sb1.append(0);
            }
            sb1.append(b1);
            s1 = sb1.toString();
            s2 = b2;
        }
        //进位
        int flag = 0;
        StringBuffer sb2 = new StringBuffer();
        for (int z = s1.length() - 1; z >= 0; z--) {
            //字符’0’的对应的ASCII十进制是48
            //分情况判断
            if ((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 0) {
                sb2.append(flag);
                flag = 0;
                continue;
            }
            if (((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 0) || ((s1.charAt(z) - 48) == 1
                    && (s2.charAt(z) - 48) == 0 && flag == 0)) {
                sb2.append(1);
                flag = 0;
                continue;
            }
            if (((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 1) || ((s1.charAt(z) - 48) == 1
                    && (s2.charAt(z) - 48) == 0 && flag == 1)) {
                sb2.append(0);
                flag = 1;
                continue;
            }
            if ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 0) {
                sb2.append(0);
                flag = 1;
                continue;
            }
            if ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 1) {
                sb2.append(1);
                flag = 1;
            }
        }
        if (flag == 1) {
            sb2.append(flag);
        }
        //倒置
        sb2.reverse();
        return sb2.toString();
    }



	/**
     * 二进制相加(测试结果精确度)
     * @Author @zzh
     * @Description //TODO
     * @Date 14:23 2023/5/4
     * @param a
     * @param b
     * @return java.lang.String
     **/
    public static String addBinary(String a, String b) {
        int carry = 0; // 保存进位
        int sum = 0; // 存储进位与两个位之间的和
        int opa = 0;
        int opb = 0;
        StringBuilder res = new StringBuilder();
        //将两个二进制数位补齐,在短的前面添0
        while (a.length() != b.length()) {
            if (a.length() > b.length()) {
                b = "0" + b;
            } else {
                a = "0" + a;
            }
        }
        //从后往前做加法
        for (int i = a.length() - 1; i >= 0; i--) {
            // String a 中的字符的ASCII码值与‘0’字符的差值
            opa = a.charAt(i) - '0';
            // String b 中的字符的ASCII码值与‘0’字符的差值
            opb = b.charAt(i) - '0';
            sum = opa + opb + carry;
            if (sum >= 2) {
                carry = 1;
                res.append((sum - 2));
            } else {
                carry = 0;
                res.append(sum);
            }
        }
        if (carry == 1) {
            res.append("1");
        }
        return res.reverse().toString();
    }
    

标签:charAt,48,二进制,相加,算法,flag,&&,append
From: https://blog.51cto.com/u_16111319/6740685

相关文章

  • m基于FPGA的带相位偏差64QAM调制信号相位估计和补偿算法verilog实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:将FPGA的仿真结果导入到matlab中,显示星座图,结果如下所示:2.算法涉及理论知识概要在现代通信系统中,调制技术是实现高速数据传输和频谱效率优化的重要手段。其中,64QAM调制技术是一种常见的高......
  • 文心一言 VS 讯飞星火 VS chatgpt (60)-- 算法导论6.4 4题
    文心一言VS讯飞星火VSchatgpt(60)--算法导论6.44题四、证明:在最坏情况下,HEAPSORT的时间复杂度是Ω(nlgn)。文心一言:要证明在最坏情况下,HEAPSORT的时间复杂度是Ω(nlogn),我们需要考虑在何种情况下堆排序的时间复杂度最低。在堆排序中,构建最大堆的时间复杂度为O(n),这是因......
  • PID算法:标准PID算法的一些改进措施
    前面的几篇文章分别分享了PID算法的原理、增量式和位置式PID算法的区别、以及过程控制中一些重要的指标,感兴趣的朋友可以回看之前的文章或者自行查阅资料。在实际项目中,使用数字PID算法对系统的被控量进行控制的时候,有时候并不是仅仅的使用简单的增量式或者位置式的PID就完成了对系......
  • 生物信息常见聚类算法
    UPGMA(UnweightedPairGroupMethodwithArithmeticMean)是一种常用的聚类分析方法,用于构建进化树或聚类树。它基于样本之间的相似性或距离矩阵,将样本逐步合并成群集,并计算新群集的平均距离。UPGMA的基本原理是按照距离最小的原则,通过计算两个最相似样本之间的平均距离来合并它......
  • 复习-基础课-基础算法
    1.快速排序:不稳定,其他略。2.归并排序:稳定,常用于求逆序对。voidmsort(intl,intr){if(l>=r)return;intmid=(l+r)>>1;msort(l,mid);msort(mid+1,r);//递归排序intk=0;inti=l,j=mid+1;while(i<=mid&&j<=......
  • 利用Python的JSON以及Base64模块实现二进制文件传输及反向Shell
    控制端代码:importsocketimportoptparseimportsysimportthreadingimportjsonimportbase64classMyTCPServer:def__init__(self)->None:self.port=self.get_param()try:self.s_socket=socket.socket(socket.AF_INET,......
  • 07、Raft算法简介
    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢。思考:etcd是如何基于Raft来实现高可用、数据强—致性的?1、什么是Raft算法Raft算法是现在分布式系统开发首选的共识算法。从本质上说,Raft算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致......
  • JVM专栏-垃圾回收策略与算法
    程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于Java堆和方法区,我们只有在......
  • 欧几里得算法
    算法\(\gcd(a,b)=\gcd(b,a\modb)\)。整除的一些引理\(a\midb\),表示\(b\)能被\(a\)整除。当\(a\midb\)且\(b\mida\)时,\(a=\pmb\)。当\(k\mida,k\midb\)时,\(d\mid(ax+by)(x,y\in\mathbbZ)\)。证明:令\(k=\gcd(a,b)\),则有\(k\m......
  • [TSG开发日志4]算法组件、个人编写的库文件如何封装成DLL,如何更好地对接软件开发?
    写在前面这个内容确实是我有点疏忽了,我以为做算法的同事应该多少对这方面会有点了解的。但是我想了一下我刚毕业的时候,确实对这方面的理解不深,查了很多资料才勉强搞懂什么意思,也是后来随着工程学习的愈加深入,才渐渐了解了在C++开发中动态链接库的重要性及如何编写。一般在说一个......