Strona główna » Algorytmy » Artykuły » Dodawanie Bez Dodawania
 

Dodawanie Bez Dodawania

Cel

Napisz funkcję, która obliczy sumę dwóch liczb dodatnich bez używania operatora dodawania. Takie zadanie można zrealizować na kilka różnych sposobów. Warto poznać je wszystkie, aby odkryć dodawanie na nowo.

Implementacja

Przez Odejmowanie

Jak wiadomo dwa znaki odejmowania obok siebie ostatecznie "zamieniają się" w dodawanie. Metoda chyba nie wymaga dalszego wyjaśniania, oto przykładowy kod:

  1. int DodawaniePrzezOdejmowanie(int a, int b) {
  2.   return a - (-b);
  3. }

W pętli

Niektóre języki programowania dostarczają operacje zwiększenia o 1. W myśl zadania taka operacja jest poprawna, ponieważ nie musi ona używać operatora dodawania. Dodanie dwóch liczb będzie polegać na zwiększeniu pierwszej i zmniejszaniu tej drugiej tak długo, aż druga będzie większa od 0.

  1. int DodawaniePetla(int a, int b) {
  2.   while (b > 0) {
  3.     a++;
  4.     b--;
  5.   }
  6.   return a;
  7. }

Warto tu jednak zaznaczyć, że powyższa funkcja zadziała poprawnie tylko dla dodatnich liczb, ale można rozszerzyć działanie funkcji, aby radziła sobie z ujemnymi wartościami.

Half Adder

Metoda ta opera się na sprzętowym rozwiązaniu dodawania poprzez zastosowanie jedynie operacji bitowych. W tym przypadku również należy pamiętać, że liczba ujemna to dla komputera abstrakcja, więc poprawny wynik uzyskamy tylko dla liczb dodatnich.

  1. int DodawanieHalfAdder(int a, int b) {
  2.   if (b == 0) {
  3.     return a;
  4.   }
  5.   int suma = a ^ b;
  6.   int przeniesienie = (a & b) << 1;
  7.   return DodawanieHalfAdder(suma, przeniesienie);
  8. }

Testowanie funkcji

  1. int main() {
  2.   int a, b;
  3.   cout << "Podaj dwie liczby\n a = ";
  4.   cin >> a;
  5.   cout << " b = ";
  6.   cin >> b;
  7.   cout << a << " + " << b << " = ";
  8.   cout << "\n minus " << DodawaniePrzezOdejmowanie(a, b);
  9.   cout << "\n petla " << DodawaniePetla(a, b);
  10.   cout << "\nhalf-adder " << DodawanieHalfAdder(a, b);
  11.   system("pause");
  12.   return 0;
  13. }