Solved

Conversion Binary <-> Decimal

Posted on 2002-04-12
7
83,242 Views
Last Modified: 2013-11-15
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
Comment
Question by:maomorta
7 Comments
 
LVL 2

Expert Comment

by:jonnin
ID: 6936650
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
 
LVL 2

Accepted Solution

by:
jonnin earned 100 total points
ID: 6936656
come to think of it, you can shift the bits out instead of the sprintf thing...
0
 
LVL 6

Expert Comment

by:Triskelion
ID: 6936954
// 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
Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

 
LVL 6

Expert Comment

by:Triskelion
ID: 6937577
// 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
 

Author Comment

by:maomorta
ID: 6938278
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
 
LVL 1

Expert Comment

by:Shivshankar
ID: 6938532
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
 
LVL 18

Expert Comment

by:deighton
ID: 6942302
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

Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

The article will include the best Data Recovery Tools along with their Features, Capabilities, and their Download Links. Hope you’ll enjoy it and will choose the one as required by you.
Developer portfolios can be a bit of an enigma—how do you present yourself to employers without burying them in lines of code?  A modern portfolio is more than just work samples, it’s also a statement of how you work.
This video demonstrates basic masking and how to edit the mask to reveal the desired image.
Using Adobe Premiere Pro, the viewer will learn how to set up a sequence with proper settings, importing pictures, rendering, and exporting the finished product.

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now