Forum » Programiranje » Butasto vprasanje - drobitev podatka tipa long
Butasto vprasanje - drobitev podatka tipa long
KernelPanic ::
Spostovani!
Sedaj imam eno butasto vprasanje, namrec popolnoma sem pozabil, kako se razbije npr. podatek tipa long na dva podatka tipa short (MSB in LSB)?
Sedaj imam eno butasto vprasanje, namrec popolnoma sem pozabil, kako se razbije npr. podatek tipa long na dva podatka tipa short (MSB in LSB)?
Thomas ::
long=65536*hi+lo
ali obratno. Odvisno kako velik je tisti Indijanec.
ali obratno. Odvisno kako velik je tisti Indijanec.
Man muss immer generalisieren - Carl Jacobi
KernelPanic ::
aaaaaaaaaaaaa, pizda, sj res, hvala tok casa ze nisem tega rabil da sm cist pozabu ze ... :D
MrBrdo ::
v bistvu se ponavadi to dela z shiftanjem:
če bi želel pa obratno:
Razlika je v tem da je operacija množenja precej bolj zahtevna kot shift.
long lng; short LS = (short) (lng & 0xFFFF); short MS = (short) (lng >> 2*8);
če bi želel pa obratno:
short LS, MS; long lng = ((long) MS << 2*8) | LS;
Razlika je v tem da je operacija množenja precej bolj zahtevna kot shift.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
MrBrdo ::
ponavadi...
ce ne drugega, pri dinamicnih jezikih bolj malo verjetno. poleg tega shift nekako bolje opisuje, kaj resnicno pocnes, namesto da vstavljas neke "magicne" vrednosti ala. 65536. mogoče je še kak problem zaradi unsigned/signed. v glavnem jaz bi to delal s shiftom in mislim da je tako proper.
ce ne drugega, pri dinamicnih jezikih bolj malo verjetno. poleg tega shift nekako bolje opisuje, kaj resnicno pocnes, namesto da vstavljas neke "magicne" vrednosti ala. 65536. mogoče je še kak problem zaradi unsigned/signed. v glavnem jaz bi to delal s shiftom in mislim da je tako proper.
MrBrdo
KernelPanic ::
ponavadi...Hvala za pomoc, te stvari sem cisto pozabil matr, dolgo nisem rabil ...
ce ne drugega, pri dinamicnih jezikih bolj malo verjetno. poleg tega shift nekako bolje opisuje, kaj resnicno pocnes, namesto da vstavljas neke "magicne" vrednosti ala. 65536. mogoče je še kak problem zaradi unsigned/signed. v glavnem jaz bi to delal s shiftom in mislim da je tako proper.
Mavrik ::
Ni razlike, compiler ponavadi optimizira kodo.
Take kode ti praktično noben prevajalnik ne bo optimiziral, ker ne dela faktorizacije pri prevajanju. Ne se toliko zanašati na prevajalnike, še vedno so hudo glupe zadeve. Uporabi shift če je le možno.
The truth is rarely pure and never simple.
MrBrdo ::
Mavrik: to sem tudi jaz hotel napisat, sam sem potem probal z gcc, pa je res optimiziral v shift za 16 :P Ampak tudi jaz se nebi zanašal na to.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
technolog ::
To preverit je res zelo enostavno. Preveriš če je natanko en bit "nastavljen", torej 1. Kdor to meša s faktorizacijo nima pojma.
MrBrdo ::
Res maš. Ne glede na to, shiftanje bolje opisuje kaj dejansko počneš, kot pa množenje z "magic" vrednostjo (poleg tega ti ni treba na pamet poznat triljon potenc števila 2). Poleg tega v interpretiranih jezikih to preverjanje verjetno predstavlja prevelik overhead, da bi se to delalo, torej bi moralo bit z shiftanjem v tem primeru hitreje. V glavnem ne vidim prednosti množenja tukaj.
MrBrdo
technolog ::
No, interpretani jeziki ponavadi nimajo tipov long in short :D
Smo se bl osredotočili na compilane jezike.
Vsekakor pa ti dam prav, da je shift bolj očiten. Meni je, kakemu začetniku, ki operatorja
Smo se bl osredotočili na compilane jezike.
Vsekakor pa ti dam prav, da je shift bolj očiten. Meni je, kakemu začetniku, ki operatorja
<<še ni videl pa najbrž ne.
Thomas ::
Preveriš če je natanko en bit "nastavljen", torej 1. Kdor to meša s faktorizacijo nima pojma.
Kako bi to preveril?
Če in samo če a & a-1 = 0, potem je a potenca 2.
Man muss immer generalisieren - Carl Jacobi
MrBrdo ::
No, interpretani jeziki ponavadi nimajo tipov long in short :D
Saj ni treba da imaš... Lahko imaš samo Int, še vedno lahko imaš npr. potrebo dobit ven spodnji in zgornji 2-byte del. Bitwise operatorje pa ponavadi podpirajo tudi takšni jeziki.
Thomas: na prvi pogled zgleda vredu kul trik
MrBrdo
technolog ::
Preveriš če je natanko en bit "nastavljen", torej 1. Kdor to meša s faktorizacijo nima pojma.
Kako bi to preveril?
Če in samo če a & a-1 = 0, potem je a potenca 2.
Lahko se zapelješ s for zanko čez vseh 32/64 bitov (v najslabšem primeru, obstaja še ogromno drugih). V vsakem primeru je v O(1).
Zgodovina sprememb…
- spremenil: technolog ()
MrBrdo ::
technolog: mislim da je cool tudi ta njegova rešitev "a & (a - 1) == 0"? sm na hitro pognal čez 1..65536, pa pravilno ugotovi... edino za 0 ni vredu, ker ni potenca št. 2, ampak ostalo je pa prav zgleda. je pa dost boljše kot preverjanje vsakega bita, ker rabiš samo 3 ukaze (sub and in cmp), je pa res da iz tega ne veš kateri bit je 1.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
Thomas ::
Če bi hkrati hotel vedeti, če je potenca števila dva in katera je, potem moraš uporabiti BSR in BSL. Assemblerska ukaza, ki prižgan bit iščeta z desne in z leve. Če je vsota najdenih širina registra, potem gre za potenco števila 2 in sicer BSR - 1.
Samo relativno počasi dela, za assembler.
Samo relativno počasi dela, za assembler.
Man muss immer generalisieren - Carl Jacobi
MrBrdo ::
Hvala, si bo veljalo zapomnit. Nisem vedel, da na x86 obstaja ta ukaz Cool! Čeprav za preverjanje pa tista rešitev z & še vedno rabi manj ukazov
MrBrdo
AtaStrudl ::
Naredi enostavno union ene dolge in arraya dveh kratkih (ce delas v C), in bos lahko dostopal na oba nacina.
Indijanci so pa problem, ce hoces biti portable. Za krajse stvari pomaga htonl() ^co.
Indijanci so pa problem, ce hoces biti portable. Za krajse stvari pomaga htonl() ^co.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Zaradi računalniških težav švedska borza ustavila trgovanjeOddelek: Novice / Znanost in tehnologija | 3790 (2641) | Bistri007 |
» | c# - mssql kombinacija / problem pri zapisu row-a v bazoOddelek: Programiranje | 1611 (1420) | darkolord |
» | c# - pretvorba short[2] v floatOddelek: Programiranje | 3896 (3509) | KernelPanic |
» | [C#] int v byte[] in nazajOddelek: Programiranje | 1806 (1578) | BlueRunner |
» | [C/C++] unsigned long lala = -1;Oddelek: Programiranje | 1174 (1133) | Vesoljc |