» »

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

Thomas ::

long=65536*hi+lo

ali obratno. Odvisno kako velik je tisti Indijanec.
Man muss immer generalisieren - Carl Jacobi

KernelPanic ::

aaaaaaaaaaaaa, pizda, sj res, hvala :D:)) tok casa ze nisem tega rabil da sm cist pozabu ze ... :D

MrBrdo ::

v bistvu se ponavadi to dela z shiftanjem:

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

technolog ::

Ni razlike, compiler ponavadi optimizira kodo.

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.
MrBrdo

KernelPanic ::

MrBrdo je izjavil:

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.
Hvala za pomoc, te stvari sem cisto pozabil matr, dolgo nisem rabil ...

Mavrik ::

technolog je izjavil:

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

Zakaj bi rabil faktorizacijo? Enostavno pogleda če je stvar potenca števila 2.

MrBrdo ::

Pomojem se v resnici uporablja kar kakšna simple tabelca.
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
<<
š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 ::

technolog je izjavil:

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

Thomas je izjavil:

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…

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.
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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Zaradi računalniških težav švedska borza ustavila trgovanje

Oddelek: Novice / Znanost in tehnologija
63711 (2562) Bistri007
»

c# - mssql kombinacija / problem pri zapisu row-a v bazo

Oddelek: Programiranje
121567 (1376) darkolord
»

c# - pretvorba short[2] v float

Oddelek: Programiranje
273800 (3413) KernelPanic
»

[C#] int v byte[] in nazaj

Oddelek: Programiranje
131783 (1555) BlueRunner
»

[C/C++] unsigned long lala = -1;

Oddelek: Programiranje
51145 (1104) Vesoljc

Več podobnih tem