Forum » Programiranje » [C++] Shift left
[C++] Shift left
Thomas ::
Shift (in rotate) sta presenetljivo uporabni zadevi. Za program, za človeškega programerja niti ne. Zato bi skrajno rad videl, da bi se obnašala konsistentno in logično.
Največja tragedija je pa to, da kljub fouš (Intel) obnašanju, je uporabno na nek neobičajen način. Sploh pri prediction (in kompres) algoritmih. Ne vem zakaj, sem pa to že velikokrat videl!
Razmišljam pa, da bi se v vsakem programu generirala namesto shift (ala Intel) taka shift koda, ki bi delala prav.
Nikoli več se ne more zgenerirati
A=A<<B;
lahko se pa
Tako je zadeva rešena, razen da ni 32 bit independent. Ampak tudi to se bo dalo.
Največja tragedija je pa to, da kljub fouš (Intel) obnašanju, je uporabno na nek neobičajen način. Sploh pri prediction (in kompres) algoritmih. Ne vem zakaj, sem pa to že velikokrat videl!
Razmišljam pa, da bi se v vsakem programu generirala namesto shift (ala Intel) taka shift koda, ki bi delala prav.
Nikoli več se ne more zgenerirati
A=A<<B;
lahko se pa
if (B>31) { A=0; } else { A=A<<B; }
Tako je zadeva rešena, razen da ni 32 bit independent. Ampak tudi to se bo dalo.
Gundolf ::
Uh kakšna neoptimalna rešitev Quikee Predlagam naslednjo (sicer pa je razen tistega deljenja več ali manj vseeno kaj uporabiš, ker se velikost * 8 izračuna compile-time):
Lahko se pa vse skupaj vrže v eno vrstico
in ne bo problema z omejitvami programa na recimo 5 vrstic, kjer bi ti 4 ali več pobral en shift.
Čeprav se mi še vedno zdi da bi bolj matematična definicija, ki omogoča tudi negativni argument še bolj ustrezala.
if ( B >= (sizeof(A) << 3) ) A = 0; else A <<= B;
Lahko se pa vse skupaj vrže v eno vrstico
A = (B >= (sizeof(A) << 3) ? 0 : A << B)
in ne bo problema z omejitvami programa na recimo 5 vrstic, kjer bi ti 4 ali več pobral en shift.
Čeprav se mi še vedno zdi da bi bolj matematična definicija, ki omogoča tudi negativni argument še bolj ustrezala.
Zgodovina sprememb…
- spremenil: Gundolf ()
snow ::
AMD SHL aka SAL:
The processor masks the upper three bits of the count operand, thus restricting the
count to a number between 0 and 31. When the destination is 64 bits wide, the
processor masks the upper two bits of the count, providing a count in the range of 0 to
63.
The processor masks the upper three bits of the count operand, thus restricting the
count to a number between 0 and 31. When the destination is 64 bits wide, the
processor masks the upper two bits of the count, providing a count in the range of 0 to
63.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
Thomas ::
AMD naredi isto kot Intel. Le da prehod v 64 bitov reši, Intel pa ne vem, če ga. V 128 pa zanesljivo nobeden. Tudi ne pomete bitov ven, kadar je shift ogromen.
Ampak to oboje je čudno, po moje.
To so ene take drobne razpokice ... jih bo treba obvladati nekako. Kot je omenjano zgoraj, z izogibanjem konfliktnih situacij. Ne bi dali shifte ven, ampak bi jih "normalizirali", kot sta napisala Quikee in Gundolf. V tem smislu nekaj. Tako bonitete imamo, nedefinirana situacija se pa enostavno ne pojavi. Vsaj ne v generiranih programih, v ročnih pa seveda še.
Ampak to oboje je čudno, po moje.
To so ene take drobne razpokice ... jih bo treba obvladati nekako. Kot je omenjano zgoraj, z izogibanjem konfliktnih situacij. Ne bi dali shifte ven, ampak bi jih "normalizirali", kot sta napisala Quikee in Gundolf. V tem smislu nekaj. Tako bonitete imamo, nedefinirana situacija se pa enostavno ne pojavi. Vsaj ne v generiranih programih, v ročnih pa seveda še.
snow ::
AMD PSLLQ Packed Shift Left Logical Quadwords
The low-order bits that are emptied by the shift operation are cleared to 0. If the shift
value is greater than 63, the destination is cleared to all 0s.
The low-order bits that are emptied by the shift operation are cleared to 0. If the shift
value is greater than 63, the destination is cleared to all 0s.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
Zgodovina sprememb…
- spremenilo: snow ()
Thomas ::
> If the shift value is greater than 63, the destination is cleared to all 0s.
TUKAJ zadeva NAPOSLED dela prav!
Lepo.
TUKAJ zadeva NAPOSLED dela prav!
Lepo.
snow ::
Za double quadword (128 bit) lahko pa shiftaš sam po bytih, pa če shiftaš za več ko 15, je tud 0 rezultat.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
snow ::
Intel ma isto. Oziroma bi blo prav rečt AMD.
Nič SSE2 bomo laufal a Thomas?
Nič SSE2 bomo laufal a Thomas?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
Vesoljc ::
a nista logical shift ter shift dve "razlicni" zadevi?
Abnormal behavior of abnormal brain makes me normal...
Thomas ::
Žal ni dobro!
Potem ti v SSE2 pride pravilen rezultat, ki ga ti apliciraš na C++, v dobri veri da je prav, je pa narobe za C++ standard. Ker ga bo kdo pokompiliral v ne SSE.
Poleg tega, simulacija v SSE ni "direktna", ne sme biti direktna!
Potem ti v SSE2 pride pravilen rezultat, ki ga ti apliciraš na C++, v dobri veri da je prav, je pa narobe za C++ standard. Ker ga bo kdo pokompiliral v ne SSE.
Poleg tega, simulacija v SSE ni "direktna", ne sme biti direktna!
Thomas ::
> a nista logical shift ter shift dve "razlicni" zadevi?
Sta ja. Logical kar šifta bite, aritmetični pa vodi računa o notri zapisanem številu. Pohandla, če niso bytei zaporedni.
Sta ja. Logical kar šifta bite, aritmetični pa vodi računa o notri zapisanem številu. Pohandla, če niso bytei zaporedni.
Quikee ::
Heh... >>> ne pozna vsak compiler. =)
Pravzaprav se za >> uporabi sar v primeru signed in shr v primeru unsigned =) Sej edina razlika je pri shiftanju negativnih stevil.. drugace je pa isto.
Pravzaprav se za >> uporabi sar v primeru signed in shr v primeru unsigned =) Sej edina razlika je pri shiftanju negativnih stevil.. drugace je pa isto.
Zgodovina sprememb…
- spremenil: Quikee ()
Thomas ::
>> Poleg tega, simulacija v SSE ni "direktna", ne sme biti direktna!
Zakaj ne sme biti direktnega zaganjanja bitnih stringov? Ker marsikeri kreša in evolucija na tem računalniku se zaustavi do reseta. Mogoče vsako sekundo kdaj. Zato je treba narest interpretacijo, simulacijo. Ker če kreša v simuliranem svetu, potem program ki samo simulira seveda NE kreša sam. Prišlo je do virtualnega kreša.
(Pa mogoče še iz enih drugih razlogov snow. Kar sva se pogovarjala na sobotnem chatu pa že par dni prej v tisti kavarni za nekadilce.)
Zakaj ne sme biti direktnega zaganjanja bitnih stringov? Ker marsikeri kreša in evolucija na tem računalniku se zaustavi do reseta. Mogoče vsako sekundo kdaj. Zato je treba narest interpretacijo, simulacijo. Ker če kreša v simuliranem svetu, potem program ki samo simulira seveda NE kreša sam. Prišlo je do virtualnega kreša.
(Pa mogoče še iz enih drugih razlogov snow. Kar sva se pogovarjala na sobotnem chatu pa že par dni prej v tisti kavarni za nekadilce.)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Assembler razumevanje programaOddelek: Programiranje | 2028 (919) | BivšiUser2 |
» | 1st web project... speed up?Oddelek: Programiranje | 2730 (2094) | galu |
» | Superračunalnik za štiri tisoč evrov (strani: 1 2 )Oddelek: Novice / Znanost in tehnologija | 12669 (6853) | jype |
» | [C] generator naključnih številOddelek: Programiranje | 3495 (3013) | Thomas |
» | [C] bitni operator (strani: 1 2 3 )Oddelek: Programiranje | 5566 (4399) | Thomas |