Endrju
2013-10-06 14:30

Wczoraj na forum znów pojawiła się superoptymalizacja z przesuwaniem w prawo. Wszyscy wiemy, że value / 2 oraz value >> 1 to dla typów całkowitoliczbowych bez znaku to samo. Każdy normalny kompilator nie wykorzysta w takiej operacji kosztownego dzielenia, tylko zamieni je na przesunięcie bitowe. (Pewnie są takie, które tego nie zrobią, ale w końcu są też ludzie, którzy używają IE 6 - kogo to obchodzi w 2013 roku)

Jeżeli między tymi zapisami nie ma różnicy, to który stosować? Oczywiście oba. Bo jest różnica - semantyczna. Komputer nie wie co oznaczają nasze zmienne, to tylko ciągi zer i jedynek. Programista jednak ma taką wiedzę i powinien ją wykorzystać, żeby kod był maksymalnie czytelny.

I tak: Jeżeli zmienna przechowuje liczbę zawsze powinno się używać dzielenia - przecież przy obliczaniu pola trójkąta nie przesuwamy bitowo wysokości w lewo, tylko dzielimy ją przez dwa. Jeżeli zapisujemy dane do rejestru licznika, to niczego nie dzielimy bo to nie są dla nas liczby - wartości binarne przesuwamy i maskujemy.

Warto dodać, że dla liczb ze znakiem nie ma nawet nad czym się zastanawiać - zawsze należy używać dzielenia.

Ola Nordmann

@Endrju: Chciałbym jeszcze dodać, że przy liczbach zmiennej precyzji też nie może być mowy o przesunięciach bitowych.
I notka dla wtajemniczonych - rotacje bitowe pozwalają na szybkie dzielenie/mnożenie przez kolejne potęgi dwójki LICZB CAŁKOWITYCH DODATNICH + 0 (czyli unsigned).

Azarien

@Endrju: kogo obchodzi IE6? powinno obchodzić autorów stron z innymi przeglądarkami. zainstalujesz XP, masz tylko IE6. obecnie nie da się prawidłowo wejść i ściągnąć ani IE8 ani Firefoksa, mając tylko IE6. Chrome się udało.