添加两个二进制字符串

时间:2019-10-08 19:04:27

标签: c++ binary addition

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'是什么意思?

2 个答案:

答案 0 :(得分:1)

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

二进制加法是两个二进制数的加法-此代码利用C ++如何将char强制转换为int来简化此操作。数字的ASCII code是其在幕后的表示方式;例如,'0'对应于48,'1'对应于49。C ++函数'1' - '0'实际上返回49 - 48;它减去ASCII码值。因此,例如'a' - '0'返回49'a'的代码为97,而97-48 =49。

a[i] - '0'是对此的扩展,它采用有问题的字符并从中“减去” '0'的ASCII值。如果a[i]中的字符是'0',则为48-48;否则为48。如果它是'1',则为49-48。结果分别为数字0或1,可用于二进制算术。

使用上述逻辑,代码从两个输入字符串的右侧开始,并一次解析一个字母的字符,使用这些属性来确定当前字母是'0'还是'1',然后将结果放入c。 (如果您自己执行此操作,则也可以根据需要将字符强制转换为int,如(int)a[i--]一样,但是如果输入不正确,则会失败。)

如果第一个字符串中的当前数字为c,则int变量'1'收到1,如果为'0',则收到0。如果两个字符均为'1',则c变为2;这意味着我们需要“携带”位。 c /= 2;有助于进位:由于int在除法时不会四舍五入,因此如果c为0或1,则在下一次迭代中为0,而如果它是2,在下一次迭代中将是1。

c % s + '0'正在将数字转换回char中,以添加到字符串中。它接受'0'(48)的ASCII码,如果c为0或2(将其保留为48或'0'),则将其添加0;如果{{ {1}}为1(将其更改为49或c)。有趣的是,如果您在'1'中添加了足够多的内容,它将最终进入字母,符号和其他一些不可打印的ASCII字符。

一旦您有了ASCII逻辑并准备好处理二进制逻辑,this site就会包含一个video explaining the code。祝你好运!

答案 1 :(得分:0)

如果从字符“ 0”中减去任何表示为字符的数字,则将获得其数字值。例如'2'-'0'= 2

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