Decimal to Binary conversion

vegaseat 2 Tallied Votes 2K Views Share

Convert a decimal (denary) integer to a binary string. An exercise in do ... while and while loops.

// Convert a decimal integer do a binary string
// added a test printf() you can remove later
// Turbo C modified for Pelles C     vegaseat    19nov2004

#include <stdio.h>

void dec2bin(long decimal, char *binary);

int main()
{
  long decimal;
  char binary[80];

  printf("\n\n Enter an integer value : ");
  scanf("%ld",&decimal);
  dec2bin(decimal,binary);
  printf("\n The binary value of %ld is %s \n",decimal,binary);

  getchar();  // trap enter 
  getchar();  // wait
  return 0;
}

//
// accepts a decimal integer and returns a binary coded string
//
void dec2bin(long decimal, char *binary)
{
  int  k = 0, n = 0;
  int  neg_flag = 0;
  int  remain;
  int  old_decimal;  // for test
  char temp[80];

  // take care of negative input
  if (decimal < 0)
  {      
    decimal = -decimal;
    neg_flag = 1;
  }
  do 
  {
    old_decimal = decimal;   // for test
    remain    = decimal % 2;
    // whittle down the decimal number
    decimal   = decimal / 2;
    // this is a test to show the action
    printf("%d/2 = %d  remainder = %d\n", old_decimal, decimal, remain);
    // converts digit 0 or 1 to character '0' or '1'
    temp[k++] = remain + '0';
  } while (decimal > 0);

  if (neg_flag)
    temp[k++] = '-';       // add - sign
  else
    temp[k++] = ' ';       // space

  // reverse the spelling
  while (k >= 0)
    binary[n++] = temp[--k];

  binary[n-1] = 0;         // end with NULL
}

Dani AI

Generated

A tidy teaching example from : repeated division, collecting remainders, then reversing a temp buffer to build a printable binary string. The algorithm is fine for learning loops and arrays, but the posted implementation has a few real bugs and portability issues that can produce undefined behaviour or wrong results on edge cases.

Main fixes and notes:

  • The reverse loop is off-by-one and reads temp[-1]. Replace the reversal with a loop that stops at k > 0 and then null-terminate the output, for example:
while (k > 0)
  binary[n++] = temp[--k];
binary[n] = '\0';
  • Use correct format specifiers (%ld for long) in debug prints.
  • Taking -decimal on a signed long can overflow for LONG_MIN; use an unsigned type for the absolute value or handle that case explicitly.
  • Prefer size_t for indices and always check the destination buffer size (safe size is (sizeof(long)*8)+2 for bits plus sign and NUL).
  • Avoid adding a trailing space as a sign placeholder; append sign explicitly if needed.

Comments on thread alternatives: 's bitwise approach is efficient but watch the malloc size expression; 's recursive version is concise but needs a base case for 0 and to handle negatives; 's question — keep a char string for display, or keep bits as integers (or use bit shifts) if further numeric work is required.

harshchandra -3 Junior Poster in Training

good one

vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

Vielen Dank Herr harshchandra!

magadum 0 Newbie Poster

nice doc,

but some more comments about program would help us more in understanding the program.;)

beerdragoon 0 Newbie Poster

I love the code samples on the site, I've been a long time reader and never posted anything so I figured I should contribute something (even if it sucks).

Anyhow people who teach programming like to use this exercise to teach the basics of loops, arrays and input parsing. As for the actual binary conversion, you can also do it with bit shifting but it tends to make for messy code. Here's a quick example:

void dec2bin(long i)
{
	char* str; char* p;

	str = malloc( sizeof(long)*8*sizeof(char) );
	p = str;
	while( i > 0 )
	{
		/* bitwise AND operation with the last bit */
		(i & 0x1) ? (*p++='1') : (*p++='0'); 
		/* bit shift to the right, when there are no
		bits left the value is 0, so the loop ends */
		i >>= 1; 
	}
	while( p-- != str ) /* print out the result backwards */
		 printf("%c",*p);

	free(str);
}
recrox 0 Newbie Poster

here is a recursion program for the same purpose its quite a bit shorter:

#include<stdio.h>
#include<conio.h>
void showbits(int h)
{
if(h==1)
printf("%d",h);
else
{
showbits(h/2);
printf("%d",h%2);
}
}
void main()
{
int nu;
void showbits(int h);
clrscr();
printf("Num?");scanf("%d",&nu);
printf("\nBin eq of %d is ",nu);
showbits(nu);
getch();
}
Q8iEnG 0 Junior Poster

Really nice Idea I was searching for the formula to change from digit to binary,


but please guys could you type some comments in the codes to understand them?

ksj 0 Newbie Poster

Sorry if this is a dumb question, but why use char string and not integer array to store the binary number?
And if i want to use the obtained binary number for further calculations, how is it possible with char string?

chescarleta18 0 Newbie Poster

recrox,what is showbits for?

arun26 -4 Newbie Poster
main()
{
int i,c=0,sum=0;
scanf("%d",&i);
while(i>=0)
{
i=i%2;
sum=sum+i*pow(10,c);
i=i/2;
c++
}
printf("%d",sum);
}
Salem commented: total waste of effort - to post, as well as to read. -4
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.