添加两个二进制字符串

Adding two binary strings

while循环中的代码块如何执行?

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

另外这里cint类型,那么c%2+'0'和任意字符a[i]-'0'是什么意思?

任何表示为字符的数字,如果从 char '0' 中减去,您将得到它的数值。例如'2' - '0' = 2

C%2 - 将得到余数 0 或 1,然后添加 '0' 将其转换为字符 即从“1”(字符)到 1(整数)

tl;dr 它使用 ASCII 算法将字符转换为数字以用于二进制算法。

二进制加法是两个二进制数的加法 - 此代码利用 C++ 如何将 char 转换为 int 以促进此操作。数字的 ASCII code 是它在幕后的表示方式;例如,'0'对应48,'1'对应49。C++函数'1' - '0'实际上是returning 49 - 48;它减去 ascii 代码值。这就是为什么,例如 'a' - '0' return 49'a' 的代码是 97,而 97 - 48 = 49。

a[i] - '0' 是这个的扩展, 从中获取有问题的字符和 "subtracting" '0' 的 ASCII 值。如果a[i]中的字符是'0',则为48 - 48;如果是'1',则为49 - 48。结果分别为数字0或1,可用于二进制运算。

使用上述逻辑,代码从两个输入字符串的右侧开始,一次解析一个字母的字符,使用这些属性来确定当前字母是否为 '0''1',然后将结果放入 c。 (如果你自己这样做,你也可以根据需要将字符转换为 int,就像 (int)a[i--] 一样,但是如果输入错误,这将失败。)

如果第一个字符串中的当前数字是 '1',则 int 变量 c 接收 1,如果是 '0',则接收 0。如果两个字符都是'1',那么c就变成2;这意味着我们需要 "carry" 这个位。 c /= 2;促进了进位:因为ints在被分割时不舍入,如果c是0或1,那么在下一次迭代中它将是0,而如果是2,下一次就是1。

c % s + '0' 正在将数字转换回 为要添加到字符串的 char。它采用 '0' (48) 的 ASCII 代码,如果 c 为 0 或 2(将其保留为 48,或 '0'),则向其添加 0,如果 c 为 1(将其更改为 49,或 '1')。有趣的是,如果您向 '0' 添加足够多的内容,它最终会进入字母,然后是符号,以及其他一些不可打印的 ASCII 字符。

一旦您掌握了 ASCII 逻辑并准备好处理二进制逻辑,this site includes a video explaining the code。祝你好运!