Сложение двух двоичных чисел

340
25 марта 2017, 01:43

Не могли бы вы мне подсказать код сложения двух двуичных чисел, но без перевода их в десятичную систему ?

Answer 1
  1. Дополняем короткую строку нулями, чтобы выровнять длины.
  2. В цикле, начиная с последних символов строк выполняем:
    • суммирование: a ^ b ^ carry, где carry - флаг переноса с предыдущей итерации
    • вычисление переноса, перенос есть, если хотя бы два из трёх(a, b, carry) бита были включены

Код:

string sum(const string s1, const string s2) {
  int len1 = s1.size();
  int len2 = s2.size();
  // Выровняем длины строк
  string ls1 = len1<len2 ? s1 : s2;
  string ls2 = len1<len2 ? s2 : s1;
  for (int i = ls1.size(); i < ls2.size(); ++i) ls1 = '0'+ls1;
  string result;
  int carry = 0;
  for (int i = ls2.size() - 1; i >= 0; --i) {
    int bit1 = ls1.at(i) - '0'; // '0' => 0, '1' => 1
    int bit2 = ls2.at(i) - '0';
    char sum = (bit1 ^ bit2 ^ carry) + '0';
    result = sum + result;
    carry = (bit1&carry)|(bit2&carry)|(bit1&bit2);
  }
  if (carry) result = '1' + result;
  return result;
}
int main() {
  cout << sum("100111111", "1") << endl; // 101000000
  return 0;
}
READ ALSO
C++. Циклы и удаление элементов из вектора

C++. Циклы и удаление элементов из вектора

Возникла проблемаЕсть вектор чисел arr, к примеру {1, -1, -1, 2, -2, 1, 1}

293
Подключить clang++ к clion

Подключить clang++ к clion

Как подключить компилятор clang++ к Clion на Windows? Параметром для cmake, как написано в туториале, компилятор не проходит тестПроблема в том, что в cmake кэше...

340
Вызов глобальной функции

Вызов глобальной функции

Сразу скажу, что пишу не на обычном C++, а под микроконтроллер AVR, но я думаю, что в этом плане никаких отличий нетЕсть файл main

311