C++ Double memória címből integer szám kiolvasása?
Sziasztok
Szóval tegnap volt órai munka(?), amire a tanár se jött rá és végül tovább léptünk, de engem érdekel, hogy lehetséges-e. Nos az volt a feladat, hogy doubleból csináljunk integert, ugye a legegyszerűbb talán ez:
Viszont a tanár úgy akarta, hogy memória címből olvassuk ki az integer értékét én valahogy így próbálkoztam(meg még máshogy is, de sehogysem jó, és sosem kapom vissza a 24et), esetleg tudnátok segíteni? vagy valami ötlet?
Igazából már órára nem kell ,csak engem akkor is érdekel, köszi szépen előre is :
Ilyen szinten én még nem vagyok, ha kérhetnélek titeket akkor elmagyaráznátok, hogy a következők mit csinálnak:?
E = E<<1 | bit;
(M>>(52+1023-E)) * (S ? -1 : 1)
A többit értem :)
És köszi szépen, magamtól nem igazán írtam volna ilyet, de legalább már ilyet is láttam, csak már meg kellene értenem ::)
Korábban már belinkeltek egy wikipedia oldat, a szabványról:
Van 64 bited, ezt kell feldarabolni. Mivel csak bájtokat lehet megcímezni, biteket nem, bitműveletekkel kell kinyerni a szükséges információt.
Külső for ciklus végigmegy a double 8 bájtján, a belső for pedig minden bájt 8 bitjén. A biteket eltároljuk attól függően hogy éppen melyik bitjét olvassuk. (lásd a wikipedia cikket) Fogtos hogy a little endian tárolási mód miatt visszafelé kell beolvasni a bájtokat.
A tárolás úgy működik hogy az aktuális bitet beszúrjuk a változónk jobb oldalára, azaz eltoljuk eggyel balra a biteket, és az utolsó bitet beállítjuk:
E = E<<1 | bit;
<<1 művelet az eggyel balra tolás, a | művelet pedig beállítja a bitet (ami csak 0 vagy 1 lehet).
Pl.:
A bit: 00000001
Az érték 00001011
Eltoljuk az értéket balra: 00001011<<1 = 00010110
Össze-VAGY-oljuk a bittel: 00010110 | 00000001 = 00010111
A kiírás kissé bonyolultabb, mert ismerni kell a szabványt. Legyen a számunk kettes számrendszerben a következő: 1011.01 (azaz decimális 11.25)
Normálalakra hozva: 1.0110100000000...000 * 2^3
Ebből tároljuk a kitevőt úgy, hogy hozzáadunk 1023-at:
3+1023 = 1026 = E
És tároljuk a számot úgy, hogy lehagyjuk az első 1-est és csak a pont mögötti részt tartjuk meg, mert a pont előtt mindig 1 áll, azt nem kell tárolni. Annyi 0 van a szám mögött hogy az pont 52 bit legyen:
0110100000000...000 = M
A kódomban az M-hez már a deklarációnál hozzáadtam az első 1-est amit nem tároltunk, ezért így néz ki az M:
10110100000000...000 = M
Ahhoz hogy csak a 1011 maradjon (azaz a decimális 11), eltoljuk az egészet a kitevővel (E-1023-al, azaz 3-al) balra, majd jobbra 52-vel. Ekkor 00000000000...0001011 marad ami a keresett szám. Ez utóbbit nem tudom jobban elmagyarázni, ha megérted a double tárolási módját, ezt is érteni fogod.
Végül beszorzom 1 vagy -1-el, attól függően hogy az előjel negatív vagy pozitív:
* (S ? -1 : 1)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!