» »

[C++] Shift left

[C++] Shift left

1
2
»

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

Quikee ::

Kaj pa ce bi rajsi...

if (B/(sizeof(A)*8))
return A=0;
else
return A>>B;

Gundolf ::

Uh kakšna neoptimalna rešitev Quikee:D Predlagam naslednjo (sicer pa je razen tistega deljenja več ali manj vseeno kaj uporabiš, ker se velikost * 8 izračuna compile-time):
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 ()

Quikee ::

Gundolf: Sem opazo :D

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

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

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?:D
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!

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.

Thomas ::

operatorja v C++ sta pa >> in >>>

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.

Zgodovina sprememb…

  • spremenil: Quikee ()

Thomas ::

Sej jest sem tega tudi že zdavnaj v kali zatrl. Samo dodatno zmedo vnaša. >> zadostuje.

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.)
1
2
»


Vredno ogleda ...

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

Assembler razumevanje programa

Oddelek: Programiranje
72011 (902) BivšiUser2
»

1st web project... speed up?

Oddelek: Programiranje
172700 (2064) galu
»

Superračunalnik za štiri tisoč evrov (strani: 1 2 )

Oddelek: Novice / Znanost in tehnologija
6712603 (6787) jype
»

[C] generator naključnih števil

Oddelek: Programiranje
363469 (2987) Thomas
»

[C] bitni operator (strani: 1 2 3 )

Oddelek: Programiranje
1125513 (4346) Thomas

Več podobnih tem