• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 83272
  • Last Modified:

Conversion Binary <-> Decimal

Hi
I need two simple functions:

1 - Convert Binary to Decimal and returns this value
2-  Convert Decimal to Binary and returns this value

Thanks
0
maomorta
Asked:
maomorta
1 Solution
 
jonninCommented:
dec to bin:
what I do is make a hex lookup table

0 = "0000"
1 = "0001"
...
f = "1111"

and do an sprintf into a hex string.
int i, char * str...
sprintf(str, "%x", i);

then each hex digit is replaced with the
lookup value. Kill leading zeros if you want too...

bin to dec is easier
place the bits into an unsigned int  using shift operator
<< ...


0
 
jonninCommented:
come to think of it, you can shift the bits out instead of the sprintf thing...
0
 
TriskelionCommented:
// Binary to Decimal
http://www.c-for-dummies.com/lessons/bonus/13/

// Decimal to Binary
http://mathforum.com/dr.math/problems/kaufman.10.26.99.html

I will try to make an example.
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
TriskelionCommented:
// Cheap example.  Microsoft compiler
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


long     BinaryToDecimal(const char * pstrBinary)
{
     int     intLoop=0;
     long     lngReturn=0L;
     long     lngMultip=1L;
     for (intLoop=0; intLoop < (int)strlen(pstrBinary); intLoop++)
          {
          if ('1' == pstrBinary[intLoop])
               {
               lngReturn += lngMultip;
               }
          lngMultip *= 2;
          }
     return     lngReturn;
}


char     *     DecimalToBinary(long lngDecimal)
{
     static     char strReturn[128]={0};
     _ltoa(lngDecimal, strReturn, 2);
     return strReturn;
}


int main(void)
{
     long          lngDecimal     =     7;
     char     *     pstrBinary     =     "111";


     printf("B2D=%ld\nD2B=%s\n",     BinaryToDecimal(pstrBinary),     DecimalToBinary(lngDecimal));
}
0
 
maomortaAuthor Commented:
Hi jonnin,
As you sugested I wrote this program but I have a segmentation fault, and I can not understand where the problem is.

Can you give more details about
"bin to dec is easier
place the bits into an unsigned int  using shift operator
<< ..."

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

void int2bin(long num);

int main()
{    
     int2bin(12343);    
}


void int2bin(long num)
{
     char *hex;
     char bin[50]="";
     sprintf(hex, "%X", num);              
     while (*hex) {
          switch (*hex)
            {
                     case '0':
                             strcat(bin, "0000");                
                break;          
              case '1':
                   strcat(bin, "0001");                
                break;          
              case '2':
                   strcat(bin, "0010");
                break;
              case '3':
                   strcat(bin, "0011");
                break;
              case '4':
                   strcat(bin, "0100");
                break;
              case '5':
                   strcat(bin, "0101");
                break;
              case '6':
                   strcat(bin, "0110");
                break;
              case '7':
                   strcat(bin, "0111");
                break;
              case '8':
                   strcat(bin, "1000");
                break;
              case '9':
                   strcat(bin, "1001");
                break;
              case 'A':
                   strcat(bin, "1010");
                break;
              case 'B':
                   strcat(bin, "1011");
                break;
              case 'C':
                   strcat(bin, "1100");
                break;
              case 'D':
                   strcat(bin, "1101");
                break;
              case 'E':
                   strcat(bin, "1110");
                break;
              case 'F':
                   strcat(bin, "1111");
                break;                                
          }
                                                 
          *hex++;
     }
     
     printf("%s\n", bin);          
                         
}
0
 
ShivshankarCommented:
Make these changes...

char * hex; ----> to  
    char * hex = (char *)(malloc(sizeof(long)*2*sizeof(char)));
Also, add this as a better programming practice.
    char *start_addr = hex;

*hex++;   -----> to
   hex++; //Just hex++

At the end of the code:
  free(start_addr);
0
 
deightonCommented:
char *int2bin(long lno,char *buf)
{
     int c = 32;
     


     buf[32]=0;
     do
     {
         
          buf[--c] = '0' + (lno & 1);
          lno = lno >> 1;
     }
     while (c);
     

     return buf;

}    


long bin2int(char *buf)
{
     long val=0;
     int c=0;


     while (buf[c])
     {
          val = (val << 1) | (buf[c++]-'0');
     }
         
     return val;

}


'example

printf("\n%s",int2bin(1024,test));
printf("\n%li",bin2int(test));

0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now