binær variable konv. til et decimal tal

Tags:    c++ asp

<< < 12 > >>
Hej

Jeg har et problem - jeg en variable hvor i der ligge en værdi, som er udtryk binært ..Denne værdi vil jeg meget gerne skal have lavet om til et decimal tal.

eks.
ind_data = ('10101000')

trylle trylle

printf ("%s",dec);

reslutere i at der kommer til at stå 168 på skærmen


Husk det skal være i rent C sporg (ikke noget med C++).

Håber at der er nogen som kan hjælpe mig.

MVH
Icecube



11 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
User
Bruger #24 @ 27.05.02 08:10
Hej igen - Jeg har hørt det er et endian problem... det KAN løses sådan her:



#include <stdio.h>

unsigned long switch_endian(void *input, unsigned char size);



int main(void)
{
unsigned char A = 1,B;

printf("A = %d : %x \\n", A, A);

B = switch_endian(&A, sizeof(A));

printf("B = %d : %x \\n", B, B);



return(0);
}


unsigned long switch_endian(void *input, unsigned char size)
{
unsigned long output=0, I = *((unsigned long*) input);
unsigned char x = (size*8)-1, *d;

do{
output|= I&1;
output<<=1, I>>=1;
}while(--x);

d = (unsigned char *) output;

return(output);
}

i c++ ville man nok lave en template funktion - så slipper man for size og en masse andre besværlige problemer....[Redigeret d. 27/05-02 10:23:56 af Daniel Lauritzen]



binær variable konv. til et decimal tal

Som jeg ser det kan det selvfølgelig gøres med printf, men i ansy c bør det gøres på en anden måde. (pga hastighed)

Da det binære talsystem er delt op efter vægt prinsippet. Hver cifre har en vægtning.
Udregning

MSB LSB
1 0 0 0 0
d4 d3 d2 d1 d0

Omregning til dec

a = d0*2^ 0 + d1*2^1 + d2*2^2 + d3*2^3 + d4*2^4 hvilket kan omskrives til
a = d0*1 + d1*2 + d2*4 + d3*8 + d4*16

Hvilke giver vægtning i det binære system...

f(x)=dn*r^(n-1)
hvor r=2, d værdien (0 eller 1) og n bit nr.

MVH
Janus

P.s MSB mest betydene bit. LSB mindst betydene bit

Håber det kunne bruges
[Redigeret d. 05/06-02 02:45:40 af Janus S. Andersen]



Hej

Jeg har et problem - jeg en variable hvor i der ligge en værdi, som er udtryk binært ..Denne værdi vil jeg meget gerne skal have lavet om til et decimal tal.

eks.
ind_data = ('10101000')

trylle trylle

printf ("%s",dec);

reslutere i at der kommer til at stå 168 på skærmen


Husk det skal være i rent C sporg (ikke noget med C++).

Håber at der er nogen som kan hjælpe mig.

MVH
Icecube


Hej

Kan du ikke bare ændre din udvælgelse operator:

printf("%d",dec); //Som decimal
printf("%x",dec); //Som hex
osv.

Variablens indhold er jo ikke en bestem talform. Om man skriver i en variabel som decimal, hex eller binær er jo ensbetydende at den kun kan læses i det format som dens indhold er indtastet med.

Med venlig hilsen
Thomas Vanting




User
Bruger #24 @ 24.05.02 07:38
Hejsa..

Det her skulle kunne gøre det.. (synes ikke lige jeg kan komme i tanke om nogen indbygget funktion der klare tricket)

#include <stdio.h>

unsigned long StrBin2Dec(unsigned char *bitstr);

#define MAXBITS 32

int main(void)
{
char BitPattern[] = "00000000000000000000000000100000";

printf("I er nu %U - ud fra strengen : %s\\n",
StrBin2Dec(BitPattern), BitPattern);

return(1);
}



unsigned long StrBin2Dec(unsigned char *bitstr)
{
unsigned long x=MAXBITS, I=0;

do{
I<<=1;
I+= *(bitstr++)-0x30;
}while((*bitstr)&&(--x));

return(I);
}

Den er naturligvis begrænset af 32 bit - men det skulle vel også være rigeligt---
MVH
Daniel



binær variable konv. til et decimal tal

Som jeg ser det kan det selvfølgelig gøres med printf, men i ansy c bør det gøres på en anden måde. (pga hastighed)

Da det binære talsystem er delt op efter vægt prinsippet. Hver cifre har en vægtning.
Udregning

MSB LSB
1 0 0 0 0
d4 d3 d2 d1 d0

Omregning til dec

a = d0*2^ 0 + d1*2^1 + d2*2^2 + d3*2^3 + d4*2^4 hvilket kan omskrives til
a = d0*1 + d1*2 + d2*4 + d3*8 + d4*16

Hvilke giver vægtning i det binære system...

f(x)=dn*r^(n-1)
hvor r=2, d værdien (0 eller 1) og n bit nr.

MVH
Janus

P.s MSB mest betydene bit. LSB mindst betydene bit

Håber det kunne bruges




User
Bruger #24 @ 05.06.02 08:38

MSB LSB
1 0 0 0 0
d4 d3 d2 d1 d0

Omregning til dec

a = d0*2^ 0 + d1*2^1 + d2*2^2 + d3*2^3 + d4*2^4 hvilket kan omskrives til
a = d0*1 + d1*2 + d2*4 + d3*8 + d4*16

Hvilke giver vægtning i det binære system...

f(x)=dn*r^(n-1)
hvor r=2, d værdien (0 eller 1) og n bit nr.

...
og det hurtige er hvor ??? (pga hastighed)




og det hurtige er hvor ??? (pga hastighed)


Mester C++...
Prøv lige at se hvordan "printf" omregner tallet. (Prøv f.eks. i MATLAB, så kan du se problem med hastighed hvad angår printf. Gidder ikke sende dig en graf over forskellen, men du kan evt. selv tegne den)

Som du nok ved bruges ansy C, tit til CPU - programmering, og hvis dette er tilfældet er det nok ikke smart at bruge include. Eller hva er dit råd ????

Jeg skal pænt blande mig uden om D..........

Forsøgte blot at være venlig......

Pas godt på dig selv !!!!





og det hurtige er hvor ??? (pga hastighed)


Mester C++...
Prøv lige at se hvordan "printf" omregner tallet. (Prøv f.eks. i MATLAB, så kan du se problem med hastighed hvad angår printf. Gidder ikke sende dig en graf over forskellen, men du kan evt. selv tegne den)

Som du nok ved bruges ansy C, tit til CPU - programmering, og hvis dette er tilfældet er det nok ikke smart at bruge include. Eller hva er dit råd ????

Jeg skal pænt blande mig uden om "Daniel Lauritzen", er ikke ude på at tage nogel af dine UPs.

Forsøgte blot at være venlig......

Pas godt på dig selv !!!!




User
Bruger #24 @ 21.06.02 15:02
Self skal du ikke blande dig uden om... sådan var det IKKE ment!

Jeg ved bare ikke hvad printf har med det at gøre.. den eneste grund til jeg skrev printf, er bare så man under eksekvering kan se hvad den laver...

men alle de muls og opløftninger er da total langsomme iforhold til et par shifts og ands - eller fatter jeg intet ? - anyway så er det weekend, så det er nok det sidste..... :)

anyway - du har helt ret i beregningen og vægtning - men det er mere teoretisk end praksis



Jo du har ret i at det er hurtigt at bruge shift. Men kan ikke se nogen hastigheds forskel i MATLAB.
Syntes selv a = d0*1 + d1*2 + d2*4 + d3*8 + d4*16 er nemmere. Men ok det er en smags sag....

Godt ord igen





<< < 12 > >>
t