Binärt till decimalt - algoritm

Permalänk
Medlem

Binärt till decimalt - algoritm

Låt oss säga att vi har ett binärt tal som består av 256 bitar (typ en bitset<256>) och jag vill omvandla detta till decimaltal representerat av en sträng. Hur går man tillväga?
Det finns säkert färdiga libbar för detta men jag vill som sagt veta algoritmen bakom.
Jag hade svårt att hitta något på google och dylikt så alla källor om ämnet välkomnas.

Visa signatur

citera!

Permalänk
Medlem

ett binärt representerat tal kan representeras i godtycklig annan bas.

låt T = {b_n, b_{n-1}, ... , b_3, b_2, b_1, b_0}
exempelvis 100101
då skulle b_0 = 1, b_2=1, b_5=1 och alla andra b_n = 0.

För att räkna ut för basen 10 så räknar du ut: (b_0)*2^0 + (b_1)*2^1 + ... +(b_{n-1})*2^(n-1) + (b_n)*2^n

alltså 100101 ==> 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^4 = 1 + 4 + 16 = 21

Visa signatur

weeeee

Permalänk

waaou!

Visa signatur

Citera för svar

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mounte
ett binärt representerat tal kan representeras i godtycklig annan bas.

låt T = {b_n, b_{n-1}, ... , b_3, b_2, b_1, b_0}
exempelvis 100101
då skulle b_0 = 1, b_2=1, b_5=1 och alla andra b_n = 0.

För att räkna ut för basen 10 så räknar du ut: (b_0)*2^0 + (b_1)*2^1 + ... +(b_{n-1})*2^(n-1) + (b_n)*2^n

alltså 100101 ==> 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^4 = 1 + 4 + 16 = 21

Är det påhittarN^ som är på gång?

100101 är ju för fan 37!

Puss!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Apeman90
Är det påhittarN^ som är på gång?

100101 är ju för fan 37!

Puss!

hur räknar man då?

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av zalleswe
hur räknar man då?

Det är ganska lätt att se felet:

Citat:

Ursprungligen inskrivet av mounte
alltså 100101 ==> 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^4 = 1 + 4 + 16 = 21

5, 32 och 37 skall det vara.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mounte
ett binärt representerat tal kan representeras i godtycklig annan bas.

låt T = {b_n, b_{n-1}, ... , b_3, b_2, b_1, b_0}
exempelvis 100101
då skulle b_0 = 1, b_2=1, b_5=1 och alla andra b_n = 0.

För att räkna ut för basen 10 så räknar du ut: (b_0)*2^0 + (b_1)*2^1 + ... +(b_{n-1})*2^(n-1) + (b_n)*2^n

alltså 100101 ==> 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^4 = 1 + 4 + 16 = 21

Hur tänkte du att jag skalle räkna ut 2^128? Flyttal förlorar ganska snabbt precisionen på ett 32-bits system (även om man börjar från lsb).

Visa signatur

citera!

Permalänk
Medlem

Det lättaste är att skriva upp det.

128 64 32 16 8 4 2 = Binära
0 1 0 0 1 0 1

Då är det 64+8+2=74 i det decimala

Detta är så vi lärde oss i skolan, Men ni snackar om 256bitar. Har kanske fel då.

Visa signatur

Dell U2412M, Fractal Design R4 svart,Asus P7P55D EVO s1156, Intel i5 750 @3.2Ghz, Thermaright MUX-120, Gigabyte HD6870, 2x4GB Corsair XMS3, 120GB Samsung 470 SSD, 2x1TB Samsung F3 HDD, Corsair VX 550W

Permalänk
Medlem

Jag kanske var oklar, tanken är att datorn skall göra detta. Tänk typ:

template <int T> char* bin2string(bitset<T> b) { ... return "12000312381378281239812398124"; //eller vad det blir }

Visa signatur

citera!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Dosshell
Jag kanske var oklar, tanken är att datorn skall göra detta. Tänk typ:

template <int T> char* bin2string(bitset<T> b) { ... return "12000312381378281239812398124"; //eller vad det blir }

Det finns inte inbyggt i C++ eller STL att kunna hantera godtygligt stora heltal.

Tredjepartsbibliotek eller att skriva en egen "BigInt"-klass (internt representera siffrorna i en vektor?) är lösningen här.

Algoritmerna för att implementera multiplikation och addition för en "BigInt"-klass? Tja... hur gör du när du räknar med papper och penna?

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

Weeblie, det är precis en egen BigInt klass jag skissar på. Jag gör detta av ren nyfikenhet och därför vill jag inte använda mig av tredjepartsbibliotek. Jag har inga problem med operatorerna men dock har jag problem med att berätta för användaren vad det är för ett tal. Jag tänkte att enklast är att omvandla det till en sträng, men jag har ingen aning om hur...

Visa signatur

citera!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Dosshell
Weeblie, det är precis en egen BigInt klass jag skissar på. Jag gör detta av ren nyfikenhet och därför vill jag inte använda mig av tredjepartsbibliotek. Jag har inga problem med operatorerna men dock har jag problem med att berätta för användaren vad det är för ett tal. Jag tänkte att enklast är att omvandla det till en sträng, men jag har ingen aning om hur...

Använder du en annan bas än bas 10 i din BigInt klass?

I så fall är heltalsdivision och modulos-räkning den sökta lösningen.

Med andra ord; något i stil med:

string getBase10(BigInt num) { string digits; // Räkna ut entals-siffran först, sedan tiotals-siffran, hundratals-siffran, o.s.v. while(num > 0) { int digit = num % 10; digits.push_back(digit + '0'); num /= 10; } // Entals-siffran ligger i digits[0], tiotals-siffran i digits[1], o.s.v. // Kan vara en god idé att vända på alla siffrorna då! reverse(digits.begin(), digits.end()); return digits; }

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

Givetvis!
Jag brukar använda denna algoritm för att omvandla decimala tal till binära, men jag tänkte inte på att det går att köra den åt båda håll. Eller rättare sagt, jag tänkte inte alls.
Tack Weeblie!

Visa signatur

citera!