Hey guys I could really use some help here. In my program I need to ask the user for two 4 bit binary numbers . Then if they select add then add or if multiply then multiply. my problem is that I got the addition to work but the multiply is messing up somewheres. Or maybe I'm going about it the wrong way any ideas.

#include <iostream>
#include <string>
#include <fstream>   //for ifstream,ofstream
#include <iomanip>
#include <stdio.h>  // Need for getchar

using namespace std;



int main()
{

	char num1[5];
	char num2[5];
	char multinum[5];
	char multinum2[5];
	char multinum3[5];
	char multinum4[5];
	char total[5];
	int i;
	bool done;
	int j;
	char option;
	int carry; 
	carry = '0';


	cout << " Enter 4 bit binay num" << endl;
	cin >> num1;


	cout << " Enter 4 bit binay num" << endl;
	cin >> num2;



	for ( i = 0; i <4 ; i++)
		total[i]  = '0';

	for ( i = 0; i <4 ; i++)
		multinum[i]  = '0';

	for ( i = 0; i <4 ; i++)
		multinum2[i]  = '0';

	for ( i = 0; i <4 ; i++)
		multinum3[i]  = '0';

	for ( i = 0; i <4 ; i++)
		multinum4[i]  = '0';


	cout<< " What would you like to do? " << endl;
	cout << " 1. Add \n" << "2. Multiply \n" << "3. Quit\n" << endl;
	cin >> option;



	/// add binary nums


	if ( option == '1')
	{
		for ( i=3; i > -1; i--)
		{
			//cout << num1[i] << " " << num2[i] << " " << carry << endl	;
			if ( num1[i]== '0' && num2[i] == '0' && carry == '0')
			{
				carry = '0';
				total[i] = '0';
			}
			else if ( num1[i]=='1' && num2[i]=='1' && carry == '1' )
			{
				carry = '1';
				total[i] = '1';
			}

			else if ( num1[i] == '1' && num2[i] == '1' && carry == '0' )
			{
				carry = '1';
				total[i] = '0';
			}
			else if ( num1[i] == '1' && num2[i] == '0' && carry == '0' )
			{
				carry = '0' ;
				total[i] = '1';
			}
			else if ( num1[i] == '1' && num2[i] == '0' && carry == '1' )
			{ 
				carry = '1';
				total[i]= '0';
			}
			else if ( num1[i] == '0' && num2[i] == '0' && carry == '1' )
			{
				carry = '0' ;
				total[i] = '1';
			}
			else if ( num1[i] == '0' && num2[i] == '1' && carry == '1' )
			{
				carry = '1' ;
				total[i] = '0';
			}

			else if ( num1[i] == '0' && num2[i] == '1' && carry == '0' )
			{
				carry = '0' ;
				total[i] = '1';
			}

		}
	}




	/// multiply binary nums



	else if ( option == '2')
	{

		for ( i = 3 ; i > -1 ; i--)
		{
			if ( num2[i] == '1' && i == 3 )
				strcpy(multinum,num1);

			else if ( num2[i] == '0' && i == 3)
			{
				for ( j=3 ; j > -1; j--)
					multinum[j] = '0';
			}

			else if ( num2[i] == '1' && i == 2)
			{
				multinum2[3] = '0';
				multinum2[2] = num1[3];
				multinum2[1] = num1[2];
				multinum2[0] = num1[1];
			}

			else if ( num2[i] == '0' && i == 2 )
			{
				for ( j=3 ; j > -1; j--)
					multinum2[j] = '0';
			}


			else if ( num2[i] == '1' && i == 1)
			{
				multinum3[3] = '0';
				multinum3[2] = '0';
				multinum3[1] = num1[3];
				multinum3[0] = num1[2];
			}

			else if (num2[i] == '0' && i == 1)

			{
				for ( j=3 ; j > -1; j--)
					multinum3[j] = '0';
			}


			else if (num2[i] == '1' && i == 0)
			{
				multinum4[3] = '0';
				multinum4[2] = '0';
				multinum4[1] = '0';
				multinum4[0] = num1[3];

			}

			else if ( num2[i] == '0' && i == 0 )
			{

				for ( j=3 ; j > -1; j--)
					multinum4[j] = '0';

			}
		}
	}








	for ( i = 3 ;i >-1; i--)
	{
		if (carry == '1' )
		{

			if ( multinum[i] == '0')
			{
				total[i] = '0';
				carry = '0';
			}
			else if ( multinum[i] == '1')
			{  carry = '0';
			total[i] = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if (multinum[i] == '0' && multinum2[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '0')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '1';

			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '1';

			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '0';

			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '1')
			{ 
				total[i] = ' 0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '0')
			{ 
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '0')

			{ 
				total[i] = '1';
				carry = '1';
			}

		}
		if ( carry = '0')
		{ 
			if ( multinum[i] == '0')
			{
				total[i] = '0';
				carry = '0';
			}
			else if ( multinum[i] == '1')
			{  carry = '0';
			total[i] = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if (multinum[i] == '0' && multinum2[i] == '1')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0')
			{
				total[i] = '0';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '1';

			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '1';

			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '0';

			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '1';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '1')
			{ 
				total[i] = ' 1';
				carry = '0';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '0' && multinum4[i] == '1')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '1' && multinum4[i] == '0')
			{
				total[i] = '0';
				carry = '1';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '1' && multinum3[i] == '0' && multinum4[i] == '0')
			{
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '0' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '0')
			{ 
				total[i] = '1';
				carry = '0';
			}
			else if ( multinum[i] == '1' && multinum2[i] == '0' && multinum3[i] == '1' && multinum4[i] == '0')

			{ total[i] = '0';
			carry = '1';
			}
		}
		}
		//// print out for testing purpose
		cout << "total" << endl;
		for ( i=0; i < 4 ;i++)
			cout << total[i];

		cout << endl << " multinum ";

		for ( i=0; i < 4 ;i++)
			cout <<  multinum[i];

		cout << endl << " multinum2 ";


		for ( i=0; i < 4 ;i++)
			cout << multinum2[i]; 

		cout << endl << " multinum3 ";

		for ( i=0; i < 4 ;i++)
			cout <<  multinum3[i];

		cout << endl << " multinum4 ";

		for ( i=0; i < 4 ;i++)
			cout << multinum4[i];

		cout << endl << endl;
		cout << " test" << endl;

		cout.setf (ios::showpoint );
		cout.setf( ios::fixed);
		cout << setprecision(2);
		cout << "\n Press enter to continue" << endl;
		char ch = getchar();
		return 0;
	}

Dani AI

Generated

The multiplication problem here is a classic case of doing low-level bit work by hand. That approach is fragile: mixed use of char vs numeric carry, many nested conditionals, and one clear bug (if ( carry = '0') uses assignment, not comparison) make the logic hard to reason about and easy to break. pointed in the right direction: convert the 4-bit strings to numbers, do the arithmetic, then convert the result back to binary. confirmed that approach worked for them.

A compact, robust pattern uses std::bitset (or std::stoi/strtol) to parse and print binary safely. Convert each 4-bit input to an integer, compute sum/product with normal integer math, then format the result with a bitset sized for the maximum possible width (addition of two 4-bit numbers needs up to 5 bits; multiplication needs up to 8 bits). This avoids manual carry management and the many condition branches in the original code.

Example (validate inputs, compute, print):

#include <iostream>
#include <string>
#include <bitset>
#include <stdexcept>

unsigned parse4(const std::string& s) {
    if (s.size() != 4) throw std::invalid_argument("must be 4 bits");
    for (char c : s) if (c != '0' && c != '1') throw std::invalid_argument("invalid char");
    return std::bitset<4>(s).to_ulong();
}

// use parse4(), compute, then print with bitset<8> or bitset<5> as needed

Notes and cautions:

  • Validate input length and characters before converting. std::bitset + to_ulong() is simple and clear; std::stoi(..., nullptr, 2) or strtol are valid alternatives if you prefer C-style functions.
  • Use unsigned types for bit math to avoid sign issues.
  • Choose the output width to match worst-case result size (8 bits for product).
  • If the assignment requires a manual bit-by-bit algorithm (for learning), implement a small helper that shifts and adds (for each set bit in multiplier add the shifted multiplicand) rather than dozens of hardcoded branches.

Further reading: std::bitset docs and std::stoi/strtol reference examples on cppreference.

Hi
maybe you want to try to use strtol command to convert the binary to integer/long. Then use this integer to do the maths. Then create a small function to convert the number into binary form again. Coding will be simpler also.

Wow thanks alot I did some research on it and have it working great. No hopefully my teacher will accept it since he hast taught us that but he has taught us pointers so I think he will. Now jsut gotta convert back to binary fun fun

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.