添加两个二进制字符串
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;
}
另外这里c
是int
类型,那么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;
促进了进位:因为int
s在被分割时不舍入,如果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。祝你好运!
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'
是什么意思?
任何表示为字符的数字,如果从 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;
促进了进位:因为int
s在被分割时不舍入,如果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。祝你好运!