11
Binary to decimal In base 2 all digits are either 0 or 1 and can be interpreted as 10111 = 1 x 1 + 1 x 2 + 1x 4 + 0 x 8 + 1 x 16 =1 x 2 0 +1 x 2 1 + 1 x 2 2 +0 x 2 3 +1 x 2 4 = 23( base 10) If b is an array containing these 5 digits so that b[0]=1, b[1]=1, b[2]=1,b[3]=0, b[4]=1, how do we write code to get to the decimal equivalent?

Binary to decimal

  • Upload
    bridie

  • View
    43

  • Download
    0

Embed Size (px)

DESCRIPTION

Binary to decimal. In base 2 all digits are either 0 or 1 and can be interpreted as 10111 = 1 x 1 + 1 x 2 + 1x 4 + 0 x 8 + 1 x 16 =1 x 2 0 +1 x 2 1 + 1 x 2 2 +0 x 2 3 +1 x 2 4 = 23( base 10) - PowerPoint PPT Presentation

Citation preview

Page 1: Binary to decimal

Binary to decimal

In base 2 all digits are either 0 or 1 and can be interpreted as

10111 = 1 x 1 + 1 x 2 + 1x 4 + 0 x 8 + 1 x 16

=1 x 20 +1 x 21 + 1 x 22 +0 x 23 +1 x 24 = 23( base 10)

If b is an array containing these 5 digits so that b[0]=1, b[1]=1, b[2]=1,b[3]=0, b[4]=1, how do we write code to get to the decimal equivalent?

Page 2: Binary to decimal

Inefficient Binary to decimal code #include <iostream.h>

#include <math.h>

int main()

{

/* to convert a binary representation to a decimal one*/

int dec=0,b[5]={1,1,1,0,1};

for (int i=0;i<5;i++)

dec+=b[i]*pow(2,i); // really inefficient

cout << dec << endl;

return 0;

}

Page 3: Binary to decimal

Somewhat efficient code-10 multiplications

int main()

{ /* to convert a binary representation to a decimal one*/

int dec=0, b[5]={1,1,1,0,1}, power2=1;

for (int i=0;i<5;i++)

{

dec+=b[i]*power2;

power2*=2;

}

cout << dec << endl;

return 0;

}

Page 4: Binary to decimal

Horner’s scheme- 4 multiplications

1 x 20 +1 x 21 + 1 x 22 +0 x 23 +1 x 24 =1 + 2 x(1 + 2x(1 + 2x(0 + 2x1)))

Recall b[0]=1, b[1]=1, b[2]=1,b[3]=0, b[4]=1

/* to convert a binary representation to a decimal one*/

int dec,b[5]={1,1,1,0,1};

dec =b[4];

for (int i=3;i>=0;i--)

{

dec=2*dec+b[i]; //horner's scheme

}

cout << dec << endl;

Page 5: Binary to decimal

Horner’s scheme via recursion

int horner(int b[ ],int i,int n);

int main()

{ /* to convert a binary representation to a decimal one*/

int dec,b[5]={1,1,1,0,1};

cout <<horner(b,0,4)<< endl;

return 0;

}

int horner(int b[ ],int i,int n)

{ if (i==n)

return b[n]; //base case

else

return 2*horner(b,i+1,n)+b[i];

}

Page 6: Binary to decimal

Hex to decimal

int horner(char hex[ ],int i,int n);int main(){ /* to convert a hexadecimal representation to a decimal one*/

char hex[]="C1A"; //this is A*256 + 16 +Acout <<horner(hex,0,2);return 0;

}int horner(char hex[ ],int i,int n){int d;

if (hex[i]>='A')d=10+hex[i]-'A';

elsed=hex[i]-'0';

if (i==n)return d;

elsereturn 16*horner(hex,i+1,n)+d;

}

Page 7: Binary to decimal

Hex to decimal reverse ordering

int horner(char hex[ ],int n);int main(){ /* to convert a hexadecimal representation to a decimal one*/

char hex[]="A1C"; //this is A*256+1*16 +Ccout <<horner(hex,2);return 0;

}int horner(char hex[ ],int n){int d;

if (hex[n]>='A')d=10+hex[n]-'A';

elsed=hex[n]-'0';

if (n==0)return d;

elsereturn 16*horner(hex,n-1)+d;

}

Page 8: Binary to decimal

Decimal to binary fractions

.625 = 6 x 10-1 + 2 x 10-2 + 5x 10-3

If .111 were a fraction in binary, then

.111 =1 x 2-1 + 1 x 2-2 +1 x 2-3 = .5 +.25+.125 =.875

Let us represent .625 as

a 2-1 + b 2-2 +c 2-3 =.abc in binary

And try to find a,b, and c.

note that 2 x .625 = a 20 + b 2-1 +c 2-2 = 1.250

so integer part gives us a=1

fractional part is b 2-1 +c 2-2 =.250

multiply fractional part by 2 and integer part = 0= b

fractional part of .5 is c 2-1 so multiplying by 2 and taking integer part gives c=1

Page 9: Binary to decimal

Binary equivalent of .1

2 x .1 =.2 integer part =0

2 x .2 =.4 integer part =0

2 x .4 =.8 integer part =0

2 x .8 =1.6 integer part =1

2 x .6=1.2 integer part =1

2 x .2 =.4 integer part =0

Solution is .000110 0110 0110 0110 0110

It never ends so that if one cuts it at some point, there is always an error-

Look at http://www.ima.umn.edu/~arnold/disasters/patriot.html

To find out why this was once very important.

Page 10: Binary to decimal

double frac=.1;

int digits=1,intpart;

cout <<".";

while (digits <32 && frac!=0.)

{

frac=frac*2;

intpart=frac;

frac=frac-intpart;

cout <<intpart;

digits++;

}

Output: .0001100110011001100110011001100

C++ for converting decimal to binary fractions

Page 11: Binary to decimal

void fractobin(double frac, int digits); int main(){ cout <<".";

fractobin(.1,1); //using a recursive functionreturn 0;

}void fractobin(double frac, int digits){ int intpart;

if (digits >=32 || frac==0.)return; //base case

else{ frac=frac*2;

intpart=frac; //get integer partcout <<intpart;fractobin(frac-intpart,++digits); //call self and increment digitsreturn;

}}

Decimal to binary fraction recursive function