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;
}
这里c
是int
类型,那么c%2+'0'
和任何字符a[i]-'0'
是什么意思?
答案 0 :(得分:1)
二进制加法是两个二进制数的加法-此代码利用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(整数)