Я считаю, что это немного сложно объяснить, но вот попытка; Подумайте о том, что поэтапно сложилось только 4 случая;
0+0=0
0+1=1
1+0=1
1+1=0 (and generates carry)
Две строки обрабатывают разные случаи
sum = a ^ b
Обрабатывает регистры 0 + 1 и 1 + 0, сумма будет содержать простой регистр, все битовые позиции, которые складываются до 1.
carry = (a & b) << 1
Часть (a & b) находит все битовые позиции в регистре 1 + 1. Поскольку сложение приводит к 0, важен перенос, и он перемещается в следующую позицию влево (<< 1). К этой позиции необходимо добавить перенос, чтобы алгоритм снова запустился. </p>
Алгоритм повторяется до тех пор, пока больше не будет переносов, и в этом случае сумма будет содержать правильный результат.
Кстати, return sum
должно быть return a
, тогда и sum
, и carry
могут быть обычными локальными переменными.