C++ 二进制数加法实现 - 详细解释
这段代码实现了将两个二进制数相加的功能。
首先,定义了一个空字符串'sum'用来存储相加后的结果。
然后,使用两个指针'i'和'j'分别指向两个输入字符串'a'和'b'的末尾。
接下来,通过一个循环遍历'a'和'b'的每一位,从末尾开始相加。每次循环,将当前位置的数字转为整数并加到变量't'上,然后将't'对2取余并转为字符,将结果加入'sum'字符串的末尾,并将't'除以2。
循环结束后,如果't'不为0,说明最高位有进位,将1转为字符并加入'sum'字符串的末尾。
最后,将'sum'字符串翻转,得到最终的结果,并返回。
class Solution {
public:
string addBinary(string a, string b)
{
string sum;
int t = 0;
for(int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j)
{
if(i >= 0) t += a[i] - '0';
if(j >= 0) t += b[j] - '0';
sum.push_back((t % 2) + '0');
t /= 2;
}
if(t) sum.push_back(1 + '0');
reverse(sum.begin(), sum.end());
return sum;
}
};
代码解释:
-
string sum;: 定义一个空字符串sum用于存储最终的二进制结果。 -
int t = 0;: 定义一个整数变量t用于存储当前位的加法结果,并可能包含进位。 -
for(int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j): 这个循环从两个字符串的末尾开始遍历。i和j分别是a和b字符串的索引。- 循环条件
i >= 0 || j >= 0确保遍历完两个字符串的所有位,即使其中一个字符串长度更短。
-
if(i >= 0) t += a[i] - '0';: 如果i指向有效位,则将a中当前位的字符转为整数并加到t上。'0'是 ASCII 码中的字符 '0',减去它可以将字符转换为对应的整数。 -
if(j >= 0) t += b[j] - '0';: 同样,如果j指向有效位,则将b中当前位的字符转为整数并加到t上。 -
sum.push_back((t % 2) + '0');: 将t对 2 取余的结果(即当前位的二进制结果)转为字符并添加到sum字符串的末尾。 -
t /= 2;: 将t除以 2,得到进位结果,为下一位加法准备。 -
if(t) sum.push_back(1 + '0');: 循环结束后,如果t不为 0,说明最高位有进位,将1转为字符并添加到sum字符串的末尾。 -
reverse(sum.begin(), sum.end());: 将sum字符串反转,因为之前是从末尾开始相加的,所以结果需要反转得到正确顺序。 -
return sum;: 返回最终的二进制结果。
这整个算法的逻辑是模拟了我们用手算二进制加法的过程,逐位相加并处理进位。
原文地址: https://www.cveoy.top/t/topic/pjvr 著作权归作者所有。请勿转载和采集!