int index=(y<<u2)+x;
int index1=((y&(u-1))<<u2)+x;
Programozni nem tudóknak talán érdemes leírnom, miért írok ilyen rusnya sorokat.
Az ok a gyorsítás. Igy gyorsabb az egész. A jelek mögöttes tartalma pedig egyszerű. A y<<u2 egyenértékű az y*256 utasítással.
Miért? Mert a léptetés egy helyiértékkel viszi arrébb a számot. Olyan ez, mikor mi a 100 után teszünk mégegy nullát. Tízzel szoroztunk.
Az eltérés annyi, hogy itt 2-es számredszerben kell gondolkodni olyan esetekben, amikor bitműveleteket végzünk.
A tízes helyiértékek balról jobbra sorba 1 10 100. ..., a kettesnél 1 2 4 8 16 32 64 128 256. Az 1-esből 256-lesz, ha 8-al balra toljuk el. A << ezt az irányt jelöli, Ellentétes irány esetén osztunk az adott lépéshez tartozó számmal. Ez a szám n=2^lépésszám.
Az y&(u-1) lekorlátozza az y számot 0 és u értéke közé akkor, ha az u kettő valamelyik hatványa.
A működési elve kissé nehezebben érthető a bitműveletek ismerete nélkül.
A programban az u=256. Ez binárisan 1 0000 0000. ha ebből levonok egyet, akkor lesz belőle 255, azaz 0 1111 1111. Az &-jel az AND bitműveletnek felel meg. Az akkor ad 1-es bitértéket, ha mindkét bemenet 1. Mivel csak az alső 8 bitje 1-es a maszknak(ami most az u-1) , ezért csak az alsó 8 bit fog megmaradni az y-ból.
Nem kell bitekben gondolkodni a programozás során. Hiszen az int index az végeredményben egy közönséges decimális szám számunkra. Egyszerűen írhatnám az, hogy int index=y*256 +x. csak az kissé lassabban futna le,
Vagy írhatnám az, hogy int index1=((y%u)*256)+x; ahol a %-jel az osztás maradékát adja. Az eredmény ugyan az.
De jó tudni, hogy az a gépben egy bináris szám, és kezelhetjük úgy is.