Kezdőoldal » Számítástechnika » Programozás » C++ Double memória címből...

C++ Double memória címből integer szám kiolvasása?

Figyelt kérdés

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:

[link]

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?

[link]

Igazából már órára nem kell ,csak engem akkor is érdekel, köszi szépen előre is :



#memória #C++ #double to int
2016. ápr. 5. 11:07
1 2
 11/14 A kérdező kommentje:

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 ::)

2016. ápr. 5. 16:34
 12/14 anonim ***** válasza:

Korábban már belinkeltek egy wikipedia oldat, a szabványról:


[link]


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)

2016. ápr. 5. 19:06
Hasznos számodra ez a válasz?
 13/14 A kérdező kommentje:
Köszönöm szépen , ma is tanultam valamit :) <3 ment a zöld pacsi. :)
2016. ápr. 5. 19:37
 14/14 A kérdező kommentje:
úgy mindenkinek aki segített :D
2016. ápr. 5. 19:38
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!