# Binary to binary coded decimal conversion problem

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

1. ### LaVicNew Member

Joined:
Jul 21, 2006
Messages:
2
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

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);
}
```

Joined:
Jul 12, 2004
Messages:
15,292
365
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. ### LaVicNew Member

Joined:
Jul 21, 2006
Messages:
2
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

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

Joined:
Jul 12, 2004
Messages:
15,292