Binary to binary coded decimal conversion problem

Discussion in 'C' started by LaVic, Jul 21, 2006.

  1. LaVic

    LaVic New Member

    Joined:
    Jul 21, 2006
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Hello Everyone,

    I am new here. I would appreciate any help on a program that i am currently putting together. My program is supposed to convert 8 bit binary numbers to binary coded decimal (BCD) numbers. e.g.:

    The binary number 1111 1111 (255 in decimal) should equal 0010 0101 0101 in BCD, where 0010 => 2 (for the hundreds position), and 0101 => 5 (for the tens and units position)

    Conversion is primarily achieved by shifting and addding 3 (0011 in binary) several times.

    The binary to binary coded decimal conversion follows the follwing rules:

    #1 Shift the binary number left one bit.

    #2 If 8 shifts have taken place, the BCD number is in the Hundreds, Tens, and Units column.

    #3 If the binary value in any of the BCD columns is 5 or greater, add 3 to that value in that BCD column.

    #4 Go to 1.

    The program outputs the answer in form units, tens and hundreds in decimal form
    correct answer should be: (after 8 shifts)
    e.g.: Units = 2
    Tens = 5
    Hunds = 5
    LINK: http://www.engr.udayton.edu/faculty/jloomis/ece314/notes/devices/binary_to_BCD/bin_to_BCD.html

    I would appreciate any help. Thank you all.

    My program:
    Code:
    // 8 BIT BINARY TO BINARY CODED DECIMAL /////////////////////
    
    #include <stdio.h>
    #include <cmath>
    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    void shifting(int *arr,int max)
    
    {
    	int temp;
    	//int sh;
    	int i,n;
        
    	for(i=0;i<1;i++)   // designates how many spaces u want the binary number shifted e.g.: i<1 => 1 unit shift to the right 
    	{
    		temp=*(arr+max-1);
    		for(n=max-2;n>=0;n--)
    			*(arr+n+1)=*(arr+n);
    		*arr=temp;
    	}
    }
    
    int main()
    
    //binary number are READ FROM LEFT TO RIGHT !!!  least sig. dig. to most sig. dig. !!!
    
    {              //  |8-bit binary #  | Units |  Tens   |Hundreds|
    	int A[20] =   {1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0};
    	
    	//        |8-bit binary #  |    Units  |  Tens   |Hundreds|
    	
    	int UNITSaddition[20] = {0,0,0,0, 0,0,0,0,   1,1,0,0, 0,0,0,0,  0,0,0,0  }; //for adding 3 to the units BCD
    	int TENSaddition[20] =  {0,0,0,0, 0,0,0,0,   0,0,0,0, 1,1,0,0,  0,0,0,0  }; //for adding 3 to the units BCD
    	int HUNDSaddition[20] = {0,0,0,0, 0,0,0,0,   0,0,0,0, 0,0,0,0,  1,1,0,0  }; //for adding 3 to the units BCD
    	
    	int total = 0; int UNITSsum = 0; int TENSsum = 0; int HUNDSsum = 0;
    	
    	int doubleval[21]; int HUNDSval[19]; int TENSval[19]; int UNITSval[19];
    	
    	
    	
    	/*for (int i = 0; i < 21 ; i++)
    	{
    	doubleval[i] = (A[i]*pow(2,i));
    	printf("\n  position value %i in decimal => %d  ", i, doubleval[i]);
    	total += doubleval[i]; 
    } */
    	
    	//// DATA OVERVIEW module ////////////////////////////////////////////
    	
    	// printf("\n the binary number is equal to %d in decimal ", total);
        printf("\n original 8 bit binary number  %i %i %i %i %i %i %i %i", A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7] );
        printf("\n the UNITS bits are  %i %i %i %i ", A[8],A[9],A[10],A[11]);
        printf("\n the TENS bits are  %i %i %i %i ", A[12],A[13],A[14],A[15]);
        printf("\n the HUNDREDS bits are  %i %i %i %i \n", A[16],A[17],A[18],A[19]);
    	
    	////////////////////////////////////////////////////////////////////////////
    	//  int arr[100], N[20];
    	int max = 20; // max = Max size of the array
    	int num = 0;
    	
    	do
    	{
    		UNITSsum = 0;  
    		TENSsum = 0; 
    		HUNDSsum = 0;
    		shifting(A,max); // actual shifting function call
    		printf("I am in the loop \n");
    		for(int i=0;i<max;i++) 
    			printf("\n shifted array A[%d]= %d ",i+1, *((A + i)));
    		printf("\n");
    		num++;
    		
    		
    		// N[i] =	A[i];
    		
    		//	for( i=0;i<max;i++) 
    		//printf("\n shifted array N[%d]= %d ",i+1, N[20]);
    		
    		
    		// CALCULATION module 1 //////////////////////////////////////////////////// 
    		
    		UNITSval[8] = (A[8]*pow(2,0));
            UNITSval[9] = (A[9]*pow(2,1));
            UNITSval[10] = (A[10]*pow(2,2));
            UNITSval[11] = (A[11]*pow(2,3));
    		
    		
    		for (i = 8; i <12; i++)
    		{
    			UNITSsum += UNITSval[i];     //the 4-bit units position in decimal
    		}
    		
    		printf("\nUNITSsum = %d\n", UNITSsum);
    		
            TENSval[12] = (A[12]*pow(2,0));
            TENSval[13] = (A[13]*pow(2,1));
            TENSval[14] = (A[14]*pow(2,2));
            TENSval[15] = (A[15]*pow(2,3));
    		
            for (i = 12; i <16; i++)          //the 4-bit tens position in decimal
    		{
    			TENSsum += TENSval[i];
    			
    		}
    		
    		printf("\nTENSSsum = %d\n", TENSsum);
    		
            HUNDSval[16] = (A[16]*pow(2,0));
            HUNDSval[17] = (A[17]*pow(2,1));
            HUNDSval[18] = (A[18]*pow(2,2));
            HUNDSval[19] = (A[19]*pow(2,3));
    		
    		for (i = 16; i <20; i++)          //the 4-bit hundreds position in decimal
    		{
    			HUNDSsum += HUNDSval[i];
    		}
    		
    		printf("\nHUNDSsum = %d\n", HUNDSsum);
    		
    		//// if the binary value of any of the BCD columns is 5 or greater, add 3 to that value in that BCD column. 
    		
    		int overflow[21];
    		int array_value3[20];
    		
    		if (HUNDSsum >= 5) // add 3 to orignal binary number if hundreds sum >= 5
    		{
    			for (i=0; i<20; i++) 
    				overflow[i] = 0;
    			
    			for (i=0; i<20; i++) 
    			{  
    				
    				array_value3[i] = A[i] + HUNDSaddition[i] + overflow[i];
    				
    				if (array_value3[i] > 1)
    				{
    					overflow[i+1] = 1;
    					array_value3[i] %= 2;
    				}
    				for (i=0; i<20; i++) 
    				{
    					A[i] = array_value3[i];
    					array_value3[i] = 0;
    				}
    			}
    			
    			
    		}
    		
    		
            if (TENSsum >= 5) // add 3  to orignal binary number if tens sum >= 5
    		{
    			for (i=0; i<20; i++) 
    				overflow[i] = 0;		
    			
    			for (i=0; i<20; i++) 
    			{       
    				array_value3[i] = A[i] + TENSaddition[i] + overflow[i];
    				if (array_value3[i] > 1)
    				{
    					overflow[i+1] = 1;
    					array_value3[i] %= 2;
    				}
    				for (i=0; i<20; i++) 
    				{
    					A[i] = array_value3[i];
    					array_value3[i] = 0;
    				}
    			}
    			
    		}
    		
    		if (UNITSsum >= 5) // add 3 to orignal binary number if units sum >= 5
    		{
    			for (i=0; i<20; i++) 
    				overflow[i] = 0;	
    			
    			for (i=0; i<20; i++) 
    			{
    				
    				array_value3[i] = A[i] + UNITSaddition[i] + overflow[i];
    				if ( array_value3[i] > 1)
    				{
    					overflow[i+1] = 1;
    					array_value3[i] %= 2;
    				}
    			}
    			for (i=0; i<20; i++) 
    			{
    				A[i] = array_value3[i];
    				array_value3[i] = 0;
    			}
    			
    		}
    		
    		
    		
    		
    		
    		printf("\n the units BCD is equal to %d in decimal ", UNITSsum);     // prints units 4-bit binary# in decimal
    		printf("\n the tens BCD is equal to %d in decimal ", TENSsum);       // prints tens 4-bit binary# in decimal
    		printf("\n the hundreds BCD is equal to %d in decimal ", HUNDSsum);  // prints hundreds 4-bit binary# in decimal
    		
    		
    	}    
    	while ( num < 5); //designates how many times  the orignal array is shifted (max should be 8 for 8 bits)
        
    	for(int i=0;i<max;i++) 
    		printf("\narray outside loop A[%d]= %d ",i+1, A[i]);
    	printf("\n");
    	
    	
    	int temp_val1 = 0;
    	temp_val1 += (A[8]*pow(2,0));
        temp_val1 += (A[9]*pow(2,1));
        temp_val1 += (A[10]*pow(2,2));
        temp_val1 += (A[11]*pow(2,3));
    	
    	
    	
        int temp_val2 = 0;
    	temp_val2 += (A[12]*pow(2,0));
        temp_val2 += (A[13]*pow(2,1));
        temp_val2 += (A[14]*pow(2,2));
        temp_val2 += (A[15]*pow(2,3));
    	
    	
    	
        int temp_val3 = 0;
    	temp_val3 += (A[16]*pow(2,0));
        temp_val3 += (A[17]*pow(2,1));
        temp_val3 += (A[18]*pow(2,2));
        temp_val3 += (A[19]*pow(2,3));
    	
    	
    	printf("\nUnits = %d\n", temp_val1);
    	printf("\nTens = %d\n", temp_val2);
    	printf("\nHunds = %d\n", temp_val3);
        printf("\nnumber of shifts = %i ", num);
    	printf("\nBCD number = %i%i%i ",temp_val3, temp_val2,temp_val1);
    	
    	//Prints the 16 bit binary number in decimal form
    	//		for( i= 0; i <20; ++i) printf("\n d[%i] = %i ", i, array_value3[i]);
    	
    	
    	return (0);
    }
    
     
  2. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    Welcome to G4EF and please use proper bbcode for the code snippets you put in.

    Also can you elaborate whats the problem you are facing with the code.
     
  3. LaVic

    LaVic New Member

    Joined:
    Jul 21, 2006
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Sorry !

    The problem that i am having is that i am not getting what i expect to get if i follow the example of converting 1111 1111 to a binary coded decimal (see link).



    I test my program by changing the NUM variable in the following line close at the end to the program.

    while ( num < 5); //designates how many times the processed array is shifted

    "num" basically tells the program how many times the processed array is being shitfted during the conversion process.

    Usually the should 8 shifts for an 8 bit array , 4 shift for a 4 bit array and so on.

    This the actual array that is being processed: A[20] = {1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0};
    It is being read from left to right.

    The output that i am getting if i enter num<4 is and have array A[20] as 1111 1111 is:

    //////////////////////////////

    original 8 bit binary number 1 1 1 1 1 1 1 1
    the UNITS bits are 0 0 0 0
    the TENS bits are 0 0 0 0
    the HUNDREDS bits are 0 0 0 0

    I am in the loop <== used for debugging

    shifted array A[1] = 0
    shifted array A[2] = 1
    shifted array A[3] = 1
    shifted array A[4] = 1
    shifted array A[5] = 1
    shifted array A[6] = 1
    shifted array A[7] = 1
    shifted array A[8] = 1
    shifted array A[9] = 1
    shifted array A[10] = 0
    shifted array A[11] = 0
    shifted array A[12] = 0
    shifted array A[13] = 0
    shifted array A[14] = 0
    shifted array A[15] = 0
    shifted array A[16] = 0
    shifted array A[17] = 0
    shifted array A[18] = 0
    shifted array A[19] = 0
    shifted array A[20] = 0

    UNITsum = 1

    TENSsum = 0

    HUNDSsum = 0

    the units BCD is equal to 1 in decimal
    the tens BCD is equal to 0 in decimal
    the hundreds BCD is equal to 0 in decimal I am in the loop

    shifted array A[1] = 0
    shifted array A[2] = 0
    shifted array A[3] = 1
    shifted array A[4] = 1
    shifted array A[5] = 1
    shifted array A[6] = 1
    shifted array A[7] = 1
    shifted array A[8] = 1
    shifted array A[9] = 1
    shifted array A[10] = 1
    shifted array A[11] = 0
    shifted array A[12] = 0
    shifted array A[13] = 0
    shifted array A[14] = 0
    shifted array A[15] = 0
    shifted array A[16] = 0
    shifted array A[17] = 0
    shifted array A[18] = 0
    shifted array A[19] = 0
    shifted array A[20] = 0

    UNITsum = 1

    TENSsum = 0

    HUNDSsum = 0

    the units BCD is equal to 3 in decimal
    the tens BCD is equal to 0 in decimal
    the hundreds BCD is equal to 0 in decimal I am in the loop


    shifted array A[1] = 0
    shifted array A[2] = 0
    shifted array A[3] = 0
    shifted array A[4] = 1
    shifted array A[5] = 1
    shifted array A[6] = 1
    shifted array A[7] = 1
    shifted array A[8] = 1
    shifted array A[9] = 1
    shifted array A[10] = 1
    shifted array A[11] = 1
    shifted array A[12] = 0
    shifted array A[13] = 0
    shifted array A[14] = 0
    shifted array A[15] = 0
    shifted array A[16] = 0
    shifted array A[17] = 0
    shifted array A[18] = 0
    shifted array A[19] = 0
    shifted array A[20] = 0

    UNITsum = 7

    TENSsum = 0

    HUNDSsum = 0

    the units BCD is equal to 7 in decimal
    the tens BCD is equal to 0 in decimal
    the hundreds BCD is equal to 0 in decimal I am in the loop

    shifted array A[1] = 0
    shifted array A[2] = 0
    shifted array A[3] = 0
    shifted array A[4] = 0
    shifted array A[5] = 1
    shifted array A[6] = 1
    shifted array A[7] = 1
    shifted array A[8] = 1
    shifted array A[9] = 1
    shifted array A[10] = 1
    shifted array A[11] = 0
    shifted array A[12] = 0
    shifted array A[13] = 1
    shifted array A[14] = 0
    shifted array A[15] = 0
    shifted array A[16] = 0
    shifted array A[17] = 0
    shifted array A[18] = 0
    shifted array A[19] = 0
    shifted array A[20] = 0

    UNITsum = 5

    TENSsum = 1

    HUNDSsum = 0

    the units BCD is equal to 5 in decimal
    the tens BCD is equal to 1 in decimal
    the hundreds BCD is equal to 0 in decimal I am in the loop

    shifted array A[1] = 0
    shifted array A[2] = 0
    shifted array A[3] = 0
    shifted array A[4] = 0
    shifted array A[5] = 0
    shifted array A[6] = 1
    shifted array A[7] = 1
    shifted array A[8] = 1
    shifted array A[9] = 1
    shifted array A[10] = 0
    shifted array A[11] = 0
    shifted array A[12] = 0
    shifted array A[13] = 1
    shifted array A[14] = 1
    shifted array A[15] = 0
    shifted array A[16] = 0
    shifted array A[17] = 0
    shifted array A[18] = 0
    shifted array A[19] = 0
    shifted array A[20] = 0

    UNITsum = 1

    TENSsum = 3

    HUNDSsum = 0

    the units BCD is equal to 1 in decimal
    the tens BCD is equal to 3 in decimal
    the hundreds BCD is equal to 0 in decimal I am in the loop

    array outside loop A[1] = 0
    array outside loop A[2] = 0
    array outside loop A[3] = 0
    array outside loop A[4] = 0
    array outside loop A[5] = 0
    array outside loop A[6] = 1
    array outside loop A[7] = 1
    array outside loop A[8] = 1
    array outside loop A[9] = 1
    array outside loop A[10] = 0
    array outside loop A[11] = 0
    array outside loop A[12] = 0
    array outside loop A[13] = 1
    array outside loop A[14] = 1
    array outside loop A[15] = 0
    array outside loop A[16] = 0
    array outside loop A[17] = 0
    array outside loop A[18] = 0
    array outside loop A[19] = 0
    array outside loop A[20] = 0

    Units = 1

    Tens = 3

    Hunds = 0

    number of shifts = 5

    ///////////////////////////////////////////
     
  4. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    You are missing couple of point from the link algo.

    1. There should be 8 shifts for the 8 bit number.
    2. It should be right to left shifting otherwise your calculation for greater than 5 for adding 3 can be wrong.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice