TCH (statz) | #1, Főfasz (10443) |
2149 | #2f25 | ^ | Idézet | Wed, 03 Dec 2014 01:17:44 +01 |
46.139.*.* | *.catv.pool.telekom.hu |
A PNG konverter írása közben optimalizálgatok és felmerült egy ilyen kódrészlet:if (++x == p->width) { x = -1; }A defilterelésnél van az, hogy minden scanline-t megelőz a filter típusának byte-ja, vagyis minden sorban van egy "-1-edik pixel", de ez most mindegy... Én ezt az if-et úgy hajítottam ki, hogy x = (~(++x == p->width) + 1) | x;Magyarázata a következő: Amennyiben elértük a szélességet, úgy ++x == p->width 1-et fog visszaadni, aminek a negálása -2-őt fog eredményezni, amihez 1-et hozzáadva -1-et fogunk kapni, amit bármivel hozunk VAGY kapcsolatba, ugyanúgy -1-et kapunk, tehát az igaz ág kiegyszerűsítve, ha ++x == p->width, akkor x -1 lesz. Ha x kisebb, mint a szélesség, úgy ++x == p->width 0-át fog visszaadni, amit ha negálok, -1-et kapok, ahhoz egyet hozzáadva ismét nulla lesz az eredmény, amit bármivel hozunk VAGY kapcsolatba, azt a bármit fogjuk kapni, tehát a hamis ág is kiegyszerűsítve, ha ++x != p->width, akkor x értéke nem változik. Aztán felmerült egy ilyen kódrészlet, szintén ugyaneme problémával kapcsolatban: if (x == -1) { k = i; ++i; ++x; }Ezt úgy sikerült ifteleníteni, hogy dc[0] = k; dc[1] = i; dci = (x == -1); k = dc[dci]; i += dci; x += dci;Mivel ez nem bitbűvészkedős, ezért gondolom ez már egyértelműbb egy picit, de azért leírom: dci tartalmazza az azonosság eredményét, ami 1 vagy 0 lehet és ennek megfelelően a dc tömb tartalmazza a két ág eredményeit k-ra nézve, ha a feltétel teljesül, akkor i, ha nem, akkor önmaga. Ha a feltétel teljesül, akkor i-t és x-et inkrementálni kell, amit úgyis lehet, hogy hozzáadom az azonosság eredményét. Mondjuk egyébként ez a második rész ez a generalizált "ez vagy az", amit az első részre is felírhattam volna dci = ++x == p->width; dc[0] = x; dc[1] = -1; x = dc[dci];de annyira örültem, hogy sikerült boolalgebrásan, hogy kapjabebilgéc. :) Le az ifekkel rovatunkat hallották. |