Я нахожу это немного сложным, чтобы объяснить, но вот попытка; понемногу добавляйте, есть только 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). Перемещение должно быть добавлено в эту позицию, поэтому алгоритм запускается снова.
Алгоритм повторяется до тех пор, пока не будет больше носителей, и в этом случае сумма будет содержать правильный результат.
Btw, return sum
должно быть return a
, то и sum
, и carry
могут быть регулярными локальными переменными.
У вашего кода есть проблемы, например сумма и перенос не определены. Я предполагаю, что они являются глобальными. –
Да, сумма и перенос - это глобальные. Извини за это. – noMAD