Add Binary【二进制相加】

本文提供了一种简洁高效的 C++ 解决方案来实现两个二进制字符串的相加操作。通过对输入的二进制字符串进行逐位相加并考虑进位情况,最终返回结果也是一个二进制字符串。

PROBLEM:

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

SOLVE(C++):

class Solution{
public:
    string addBinary(string a, string b){
        string s = "";
        int c = 0, i = a.size() - 1, j = b.size() - 1;
        while(i >= 0 || j >= 0 || c == 1){
            c += i >= 0 ? a[i --] - '0' : 0;
            c += j >= 0 ? b[j --] - '0' : 0;
            s = char(c % 2 + '0') + s;
            c /= 2;
        }
        return s;
    }
};
该解法写的很简练。


### 二进制整数相加算法及其实现 #### 算法描述 对于两个 n 位的二进制整数相加,可以按照逐位计算的方式完成。核心逻辑在于处理每一位上的数值以及可能产生的进位。伪代码如下: ```plaintext ADD-BINARY(A, B): C = new integer[A.length + 1] // 结果数组,长度为 A 的长度加一 carry = 0 // 初始化进位为 0 for i from 1 to A.length: // 遍历每一位 sum_bit = A[i] + B[i] + carry // 当前位置的总和 C[i] = sum_bit % 2 // 计算当前位的结果 carry = sum_bit div 2 // 更新进位 C[A.length + 1] = carry // 将最后一位进位加入结果中 return C // 返回最终结果 ``` 此算法的时间复杂度为 O(n),其中 n 是输入二进制数的位数。 --- #### 实现细节 以下是基于 Python 和 C 的两种实现方式,分别展示了如何通过编程语言来实现该算法。 ##### Python 实现 Python 提供了内置函数 `bin()` 来获取整数的二进制表示形式,并支持字符串操作以便于手动模拟二进制运算过程。 ```python def add_binary(a, b): max_len = max(len(a), len(b)) # 获取较长的二进制串长度 a = a.zfill(max_len) # 补齐较短的二进制串 b = b.zfill(max_len) result = [] # 存储结果 carry = 0 # 进位初始化为 0 for i in range(max_len - 1, -1, -1): # 从最低有效位开始遍历 r = carry # 初始值设为进位 r += 1 if a[i] == '1' else 0 # 加入第一个二进制位 r += 1 if b[i] == '1' else 0 # 加入第二个二进制位 result.append('1' if r % 2 == 1 else '0') # 添加到结果列表 carry = 0 if r < 2 else 1 # 更新进位状态 if carry != 0: # 如果还有剩余进位,则追加 result.append('1') result.reverse() # 反转结果以匹配正常顺序 return ''.join(result) # 测试用例 a = "1101" b = "1011" print(add_binary(a, b)) # 输出应为 "11000" [^4] ``` ##### C 实现 C 语言可以通过字符数组或者按位操作符来进行二进制加法。下面是一个简单的例子,假设输入已经是以字符串的形式给出。 ```c #include <stdio.h> #include <string.h> void reverse(char* str, int length) { int start = 0; int end = length - 1; while (start < end) { char temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } } char* addBinary(const char *a, const char *b) { int len_a = strlen(a); int len_b = strlen(b); int max_len = (len_a > len_b ? len_a : len_b) + 2; // 多留一个空间给可能的进位 char *result = malloc(sizeof(char) * max_len); // 动态分配内存存储结果 memset(result, '0', sizeof(char) * max_len); // 初始化为全零 result[max_len - 1] = '\0'; // 设置结束标志 int carry = 0; int index_result = max_len - 2; // 从倒数第二位开始填充数据 for (int i = len_a - 1, j = len_b - 1; i >= 0 || j >= 0 || carry > 0; --i, --j) { int digit_a = (i >= 0 && a[i] == '1') ? 1 : 0; int digit_b = (j >= 0 && b[j] == '1') ? 1 : 0; int total_sum = digit_a + digit_b + carry; result[index_result--] = ((total_sum & 1) == 1) ? '1' : '0'; carry = total_sum >> 1; } reverse(result, max_len - 1); // 反转结果使其符合常规书写习惯 return result; } // 主程序测试部分 int main() { const char *a = "1101"; const char *b = "1011"; char *sum = addBinary(a, b); printf("%s\n", sum); // 应输出 "11000" free(sum); // 释放动态分配的空间 return 0; } ``` --- #### 数学原理说明 二进制加法规则是基于模运算的基础理论。具体来说,在每一步中都会涉及三个变量:`A[i]`, `B[i]` 和之前的进位 `carry`。它们共同决定了当前位置的新值以及下一轮的进位情况。公式表达如下: - 新值 \( \text{bit} = (\text{A}[i] + \text{B}[i] + \text{carry}) \% 2 \)[^5] - 下次进位 \( \text{new\_carry} = \lfloor(\text{A}[i] + \text{B}[i] + \text{carry}) / 2\rfloor \)[^6] 这种分步累加的方法能够确保任意大小的二进制数都可以被正确地相加起来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值