67.二进制求和
这道题有几个关键点对基础不牢的同学可能会造成误解,下面分别作说明:
1.num[i] - ‘0’ —> 字符转换成整数
当你从一个代表数字的字符中减去字符 ‘0’,你实际上是在获取该字符代表的数值。这是因为在 ASCII 编码中,数字字符从 ‘0’ 到 ‘9’ 是连续排列的,并且 ‘0’ 的 ASCII 值是 48。因此,例如字符 ‘5’ 的 ASCII 值是 53,当你计算 ‘5’ - ‘0’ 时,相当于 53 - 48,结果是 5,这正是字符 ‘5’ 所代表的整数值。
2.‘0’ + 某个整数 —> 整数转换成字符
当你向字符 ‘0’ 添加一个整数时,你实际上是在 ASCII 表中向前移动了这个整数指定的位置数。这是基于同样的原理:字符 ‘0’ 的 ASCII 值是 48,所以当你加上一个整数,比如 5,结果是 48 + 5 = 53,这在 ASCII 表中对应的字符是 ‘5’。
PS:本道题和我前面写的一道题有异曲同工之处,可以一起学习。
原文链接:https://blog.csdn.net/weixin_48648405/article/details/139976094
#define max(a, b) (a > b ? a : b) // 定义宏 max,返回两个值中的较大者
char* addBinary(char *a, char *b) {
int a_len = strlen(a); // 获取字符串 a 的长度
int b_len = strlen(b); // 获取字符串 b 的长度
// 计算结果字符串的长度:最大输入长度 + 1(可能的进位) + 1(字符串结束符)
int result_len = max(a_len, b_len) + 1 + 1;
char *result = malloc(sizeof(char) * result_len); // 分配内存用于存储结果字符串
result[0] = '0'; // 初始化结果字符串的第一位为 '0',表示默认无进位
result[result_len - 1] = '\0'; // 设置结果字符串的最后一位为字符串结束符
int c = 0; // 初始化进位为 0
int i = a_len - 1, j = b_len - 1, k = result_len - 2; // 从字符串末尾开始处理
// 遍历字符串 a 和 b,逐位相加
while (i >= 0 || j >= 0) {
// 获取当前位的值,若索引小于 0 则视为 0
int a_bit = i >= 0 ? a[i] - '0' : 0;
int b_bit = j >= 0 ? b[j] - '0' : 0;
int bit_sum = a_bit + b_bit + c; // 计算当前位的和,包括进位
result[k] = '0' + bit_sum % 2; // 计算当前位的二进制值并存储在结果字符串中
c = bit_sum / 2; // 计算新的进位
--i; // 移动到 a 的前一位
--j; // 移动到 b 的前一位
--k; // 移动到结果字符串的前一位
}
if (c != 0) // 如果最后还有进位
result[k] = '1'; // 在结果字符串的当前位存储 '1'
// 如果结果字符串的第一位是 '0',则返回指向第二位的指针;否则返回整个结果字符串
return result[0] == '0' ? result + 1 : result;
}