Binary to Decimal Conversion

vegaseat 0 Tallied Votes 3K Views Share

The computer is a binary beast. We want to go from the one-fingered digital box to the ten-fingered human being and convert binary to denary(base 10) numbers. This is how it works, for instance, binary 10010 is calculated as 1*16+0*8+0*4+1*2+0*1 = decimal 18. Just because it's easy, let's throw in hexadecimal and octal results too. The added bonus is the almost foolproof entry of data.

// Binary to Decimal, Hexadecimal and Octal conversion program
// tested with Pelles C     vegaseat     15dec2004

#include <stdio.h>
#include <string.h>

int bin2dec(char *bin);

int main()
{
  char bin[80] = "";
  char *p;
  int  dec;

  while(strcmp(bin,"0")) 
  {
    printf("\n Enter a binary number (just 0 to EXIT): ");
    fgets(bin, sizeof(bin), stdin);
    // check for and remove trailing \n
    if ((p = strchr(bin,'\n')) != NULL)
    {
      *p = '\0';
    }
    dec = bin2dec(bin);
    if (dec) printf("\nDecimal = %d  Hexadecimal = 0x%04X  Octal = 0%o\n",dec,dec,dec);
  }
  
  getchar();  // wait
  return 0;
}

// convert a binary string to a decimal number, returns decimal value
int bin2dec(char *bin)   
{
  int  b, k, m, n;
  int  len, sum = 0;

  len = strlen(bin) - 1;
  for(k = 0; k <= len; k++) 
  {
    n = (bin[k] - '0'); // char to numeric value
    if ((n > 1) || (n < 0)) 
    {
      puts("\n\n ERROR! BINARY has only 1 and 0!\n");
      return (0);
    }
    for(b = 1, m = len; m > k; m--) 
    {
      // 1 2 4 8 16 32 64 ... place-values, reversed here
      b *= 2;
    }
    // sum it up
    sum = sum + n * b;
    //printf("%d*%d + ",n,b);  // uncomment to show the way this works
  }
  return(sum);
}

Dani AI

Generated

Nice thread. ’s walkthrough nails the math, and @Dave Sinkula is right about input safety: avoid gets() and also unbounded scanf("%s", ...). Use fgets (or a width-limited %255s) to prevent overflows. Also, , note that cout/cin are C++ rather than C.

Several posts cover integer-only input. For ’s question about 101.11001: the digits after the dot are negative powers of two (1/2, 1/4, 1/8, ...). Here is a small, drop-in C parser that accepts optional sign, optional 0b/0B prefix, and an optional fractional part, returning a double. It rejects invalid characters and multiple dots.

#include <ctype.h>
#include <math.h>
#include <stddef.h>

double bin_to_double(const char *s) {
    while (isspace((unsigned char)*s)) s++;
    int neg = (*s == '-'); if (*s == '+' || *s == '-') s++;
    if (s[0] == '0' && (s[1] == 'b' || s[1] == 'B')) s += 2;

    double v = 0.0, w = 1.0; /* w==1.0 means integer part, <1.0 means fraction */
    int saw_digit = 0, saw_dot = 0;

    for (; *s; ++s) {
        if (*s == '.') { if (saw_dot) return NAN; saw_dot = 1; w = 0.5; continue; }
        if (*s == '0' || *s == '1') {
            saw_digit = 1;
            if (w == 1.0) v = v * 2.0 + (*s - '0');
            else { if (*s == '1') v += w; w *= 0.5; }
        } else if (isspace((unsigned char)*s)) {
            while (isspace((unsigned char)*s)) ++s;
            if (*s != '\0') return NAN; /* trailing junk */
            break;
        } else return NAN; /* invalid char */
    }
    return saw_digit ? (neg ? -v : v) : NAN;
}
/* Example: bin_to_double("101.11001") -> 5.78125 */

Notes:

  • For exact large integers, prefer strtoull(s, NULL, 2) on the integer part (skip any 0b first) and check for overflow. Use double only when you truly want a fractional value or do not need exact 64-bit precision.
Dave Sinkula 2,398 long time no c Team Colleague

test.c 11 error [Warning 603] Symbol 'bin' (line 8) not initialized
test.c 14 error [Warning 534] Ignoring return value of function 'gets(char *)'
test.c 14 error [Warning 421] Caution -- function 'gets(char *)' is considered dangerous
test.c 17 error [Info 725] Expected positive indentation from line 16
test.c 19 error [Warning 534] Ignoring return value of function '_fgetc(struct {...} *)'
test.c 29 error [Info 713] Loss of precision (assignment) (unsigned int to int)
test.c 47 error [Info 818] Pointer parameter 'bin' (line 24) could be declared as pointing to const

prog-bman 4 Junior Poster
Dave Sinkula 2,398 long time no c Team Colleague

It was a linter, by the way.

scanf("%s",bin);

This is just a diguised version of gets(). It suffers the same ills.

". Written by some real winner named HAMMER."

...who apparently still knows more than you.

agentmulder 0 Newbie Poster

what does n = (bin[k] - '0') do?

vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

like the comment says this turns for instance the character '1' to a numeric value 1

bumsfeld 413 Nearly a Posting Virtuoso

Wow, dude your code makes it very clear!

041020 0 Newbie Poster

please make this program in c..e.g cout,cin

dilip.mathews 3 Junior Poster in Training

A slight modification for the bin2dec function. Removes the nested for loop. Reduces the overhead and removes the temporary variable 'm'.

int bin2dec(char *bin)   
{
  int  b , k, n;
  int  len, sum = 0; 
 
  len = strlen(bin) - 1;
  for(k = 0; k <= len; k++) 
  {
   b = 1;
    n = (bin[k] - '0'); // char to numeric value
    if ((n > 1) || (n < 0)) 
    {
      puts("\n\n ERROR! BINARY has only 1 and 0!\n");
      return (0);
    }
     b = b<<(len-k);
    // sum it up
    sum = sum + n * b;
    //printf("%d*%d + ",n,b);  // uncomment to show the way this works
  }
  return(sum);
}
vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

A nice improvement by dilip.mathews! Thanks!

lester pinto 0 Newbie Poster

Nice program!!!

i'm favorly new to C and was wondering how the
line b<<(len-k) worked... all i know its shifts the digits to the left..
but what i dont get is by how much..

....ie. bin<<1 =multiply it by 2 so what does len-k do in the above statement..

hope that doesnt' sound confusing..

and also what does teh sum stand for in "sum=sum+n*b"

cheers

declum 0 Newbie Poster

your code is much long.. i found one in net
try it

long bin2dec(char *s)
{
   long r=0;
   for (; *s; r = (r<<1) | (*s++ - '0'));
   return r;
 }
vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

Good for you, but shorter is not always better. There is no error trapping, or explanation/comment how it works!

vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

binary 10010 is calculated as 1*16+0*8+0*4+1*2+0*1 = decimal 18
hence b = b<<(len-k) does the multiplication by 1,2,4,8,16 ...

sum = sum + n * b;
// this will explain it ...
printf("%d*%d + ",n,b);

CSOL 0 Newbie Poster
/*conversion of binary number to decimal*/
#include <stdio.h>

int main()
{
	int binary, digit, base = 0, decimal = 0;
	printf("enter a binary number: ");
	scanf("%d", &binary);
	printf("Entered binary number is: %d\n", binary);
	while(binary)
	{
		digit = binary % 10;
		decimal += digit << base;
		base += 1;
		binary /= 10;
	}
	printf("decimal equivalent of the entered binary number is: %d", decimal);
	return 0;
}
krishna5687 0 Newbie Poster

//decimal to binary

#include<stdio.h>
void main()

{

	long int deci,rem,bin,p=1;
	printf("enter no");
	scanf("%ld",&deci);
	if (deci > 0)

	{
		while (deci > 0)

		 {
			rem=deci%2;
			bin=rem*p+bin;
			p=p*10;
			deci=deci%2;

			}
			printf("binary no is %ld",bin);
				//end of while loop

			getchar();

			}

			//end of condition

			else

				printf("binary no for +tive integer only");

				getchar();


				}
taylorg 0 Newbie Poster

Nice code everyone! It's funny - I just had to do the same thing for a class the other day in school.

I uploaded the code to my blog... here it is: <URL SNIPPED>

Also here:

int bin2dec(char * binstr)
{
int dec = 0;
int len = strlen(binstr);
int i = 0;

while(i < len)
{
dec = (dec << 1) + (binstr[i] - 0x30);
i++;
}
return dec;
}

That's my bin2dec function. I wrote a full explanation about it on my site (or at least tried :P) Good to compare with the others.

soorajshaji -3 Newbie Poster

guys what will hapeen if we enter 101.11001

soorajshaji -3 Newbie Poster
#include<conio.h>
#include<stdio.h>
#include<math.h>
{
float n,c1,m1,ans;
int a,b,r,i=0,m,s=0,s1=0,r2,j=-1;
clrscr();
printf("enter the binary no:");
scanf("%f",&n);
b=n;
a=n%1;
while(b>0)
{
r=b%10;
c=pow(2,i);
m=r*c;
s=s+m;
b=b/10;
i++;
}
if(a>0)
{
while(a>0)
{
r1=a%10;
s1=s1*10+r1;
a=a/10;
}
while(s1>0)
{
r2=s1%10;
c1=pow(2,j);
m1=r2*c1;
s2=s2+m1;
s1=s1/10;
j--;
}}
ans=s+s2;
printf("the decimal is %f",ans);
getch();
}
WaltP commented: What a piece ot crap! No formatting, conio.h, no comments. Terrible!! -3
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.