Добавление двух двоичных строк - PullRequest
0 голосов
/ 08 октября 2019

Как выполняется блокировка кода в цикле 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'?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

tl; dr он использует ASCII-арифметику для перевода символов в числа для использования в двоичной арифметике.

Двоичное добавление - это добавление двух двоичных чисел - этот код использует то, как C ++ приводит char кint, чтобы облегчить это. Код ASCII для числа - это то, как он представляется за кадром;например, '0' соответствует 48, а '1' соответствует 49. Функция C ++ '1' - '0' фактически возвращает 49 - 48;вычитает значения кода ascii. Вот почему, например, 'a' - '0' return 49: код для 'a' равен 97, а 97 - 48 = 49.

a[i] - '0' является его расширением, взятие рассматриваемого символа и «вычитание» из него значения ASCII '0'. Если символ в a[i] является '0', это 48 - 48;если это '1', это 49 - 48. Результат - цифра 0 или 1, соответственно, которые могут использоваться для двоичной арифметики.

Используя вышеупомянутую логику, код начинается с правой стороны двух входных строк и анализирует символы по одной букве за раз, используя эти свойства, чтобы определить, является ли текущая буква '0'или '1', а затем поместить результат в c. (Если вы делаете это самостоятельно, вы можете также привести символ к int, как и (int)a[i--], если хотите, но это не удастся, если вы дадите ему неправильный ввод.)

Переменная int cполучает 1, если текущая цифра в первой строке равна '1', и 0, если это '0'. Если оба символа '1' с, то c становится 2;это означает, что нам нужно «нести» бит. Перенос облегчается с помощью c /= 2;: поскольку int s не округляются, когда они разделены, если c равно 0 или 1, в следующей итерации оно будет равно 0, тогда как если оно равно 2, оно будет равнона следующей итерации будет 1.

c % s + '0' преобразует число обратно в char для добавления в строку. Он принимает код ASCII для '0' (48) и либо добавляет к нему 0, если c равен 0 или 2 (оставляя его как 48, или '0'), либо добавляет 1 к нему, если c равен 1 (изменяетсяэто до 49, или '1'). В качестве интересного примечания: если вы добавите достаточно к '0', оно в конечном итоге перейдет к буквам, а затем к символам и некоторым другим непечатным символам ASCII.

Как только вы получите логику ASCII и будете готовы заняться бинарной логикой, этот сайт включает в себя видео с объяснением кода . Удачи!

0 голосов
/ 08 октября 2019

Любая цифра, представленная в виде символа, если вы вычтете из символа '0', вы получите ее числовое значение. например, '2' -'0 '= 2

C% 2 - вы получите остаток 0 или 1, а затем добавите' 0 ', чтобы преобразовать его в символ, то есть из' 1 '(символ) в 1 (целое число)

...