# need some help with binary addition.

Show 80 post(s) from this thread on one page
Page 2 of 2 First 12
• 01-26-2005
axon
Kleid-0 have you tested your program with various inputs...I just compiled it with different values for b1 and b2 and it doesn't work.
• 01-26-2005
axon
I modified your code a bit to receive user input, and as you can see, it does not work. Even 1+1 or 0+0;

Code:

```#include <stdio.h> #include <stdlib.h> #include <iostream> using std::cout; using std::cin; // Allow boolean types // Add binary numbers and return binary int addBinary (int b1, int b2); int main (void) {   bool notDone = true;   // Binary numbers b1 and b2 get added together   int b1, b2, b3;   while( notDone )   {         cout << "\n1st: ";         cin >> b1;                 if( b1 == 9 ) //input 9 for exit                 break;                 cout << "\n2nd: ";         cin >> b2;                 b3 = addBinary (b1, b2);         // Print out binary addition         printf ("\n%d + %d = %d\n",b1, b2, b3);   }   return 0; } // Add binary numbers and return binary int addBinary (     int b1,    // The first binary number     int b2)    // The second binary number {   // The binary addition answer, transforms into binary.   int a;   // Carrier for binary addition   bool carrier = false;   // Current digit step (starts at 1)   int s = 2;   // Add the numbers like decimal   a = b1 + b2; // Next Binary digit NBD:     // If the carrier is true, add one to the current placement     if (carrier)     {       a += 1 * (s - (s / 2));       carrier = false;     }     // If the carrier makes the postdigit a 3, we have trouble     if (a % (s / 2 + s) < s / 2)     {       a += 1 * ((s * 10) - ((s * 10) / 2));       a -= 1 * (s - (s / 2));     }     // If the addition yields a 2 * digit placement,     // remove it and set carrier binary addition to true.     if (a % s < (s / 2))     {       a -= 1 * (s - (s / 2));       carrier = true;     }     // If our digit placement is high enough, exit     if (s > a)       return a;     // Set the digit placement higher     s *= 10;     // Verify next placement (Next binary Digit)     goto NBD; }```
• 01-26-2005
Kleid-0
All of this logical thinking has destroyed my thinking capacities, I'm going to wait out this problem and come back. I'll try Scribbler's approach next time lol....I thought I knew what I was doing :(
• 01-26-2005
axon
You might want to edit your original post with the code stating that your solution does not work.
• 01-26-2005
Kleid-0
• 01-26-2005
axon
I dug and dug, and dug somemore...and finally, I found it! Not the exact solution to your problem but I knew I wrote something very similar a long time ago in my first c++ class. The assignemnt was a bit different, as I think one of the specs was that the binary number can only have a max of 4 digits (ie. 1011 is good, and 11101 is not) - this should be easily changed. Also, each input has to have leading zeros; so if you want to add 1 + 10, you should input 0001 + 0010 - I really don't remember why I did it this way - maybe becasue that the only way I knew how to :confused:

anywho I run the prog on some test input just now, and it seems to be working fine, but only with the rules I described above - no error handling whatsover (Hey it was my first c++ class, and one of the first assignments :) )

Code:

```/*  * Author: Jakub Bomba  * Class: CS100, Prof. Bell  * Date: 09.09.2002  * Title: Binary Addition  */ #include <iostream> using std::cin; using std::cout; using std::endl; /*  * Function that actually does the binary addition  * @param:        f - first binary number  *                        s - second binary number  *                        carry - flag for the carry  */ int binaryAdd(int f, //first number                           int s, //second number                           int * carry) {         int result=0;         // exhaust all of the possible cases as described in the handout         if( (f == 0) && (s == 0) )         {                 result = ( *carry );                 *carry = 0;         }         else if( (f == 0) && (s == 1) )         {                                if( *carry==0 )                         result = 1;                 else                 {                         result = 0;                         *carry = 1;                 }         }         else if( (f == 1) && (s == 0) )         {                 if( *carry==0 )                 {                         result = 1;                                        }                 else                 {                         result = 0;                         *carry = 1;                 }         }         else if( (f == 1) && (s == 1) )         {                         if( *carry==0 )                 {                         result = 0;                         *carry = 1;                 }                 else                 {                         result = 1;                         *carry = 1;                 }         }         return result; } int main(void) {         int i;          // loop counter         int carry=0;                // Initialize carry to 0 (IMPORTANT)         int n1[4];        // MSB - index 0 LSB index 3 - MSB - Most significant bit  (leftmost)         int n2[4];        // MSB - index 0 LSB index 3 - LSB - Least significant bit (rightmost)         int result[5];        // MSB - index 0 LSB index 4         char e_result[6]; // 5+null char         char e_n1[5]; // 4+null char         char e_n2[5]; // 4+null char         // get data         cout << "Enter first number: ";         cin >> e_n1;         cout << "Enter second number: ";         cin >> e_n2;         // convert from char array to int array         // It is useful to have data in int array when doing conversion into decimal         // value of a certain binary number which is not implemented in this program.         for(i = 0; i < 4; i++)         {                 n1[i] = (e_n1[i]-48);                  n2[i] = (e_n2[i]-48);                }         // initialize result array         for( i = 0; i < 5; i++)                 result[i] = 0;         // do the addition                for( i = 3; i >= 0; i--) { // go from right to left (LSB to MSB)                                 result[i+1] = binaryAdd(n1[i],n2[i],&carry);        // needs to add 1 to the counter                                                                                                                 // since LSB index for result                                                                                                                 // is 1 more than LSB of operands                                e_result[i+1] = result[i+1]+48; // For display purposes - convert to char array         }         result[0] = carry; // Add MSB of result         e_result[0] = result[0] + 48;         e_result[5] = '\0'; // Put NULL Char                 cout << "  " << e_n1 << endl;         cout << "  +" << e_n2 << endl;         cout << "  -----" << endl;         cout << "  " << e_result << endl << endl;         return 0; }```
• 01-27-2005
InvariantLoop
thanks for another tip and the boost, i was right when i said the solution uses logical operators but i was getting myself lost in the many if statements.
Show 80 post(s) from this thread on one page
Page 2 of 2 First 12