2017-10-13 72 views
5

Czytałem o implementation algorytmu z kwadratowymi kwadratami w języku C#, który otacza się, aby tworzyć spójne tekstury. Aby obliczyć następny punkt, bierze się średnią z czterech punktów próbki ułożonych w kwadrat lub brylant. Jeśli przykładowy punkt leży na krawędzi tekstury, jest owinięty wokół drugiej strony. To opakowanie wydaje się to zrobić za pomocą następującej metody:Jaka jest funkcja bitowego & w tym zestawieniu?

public double sample(int x, int y) 
{ 
    return values[(x & (width - 1)) + (y & (height - 1)) * width]; 
} 

Trochę badań mówi mi, że jest to operator bitowe. Nie używałem ich wcześniej, a wikipedia article nie było oświeceniem. Czy ktoś mógłby wyjaśnić, co robi operator w tej metodzie operator &?

EDIT: Wymiary tekstury zawsze są potęgami dwójki

Odpowiedz

8

To dla „opakowania”. Zakładając, że width i height są potęgami dwóch (w przeciwnym razie to nie działa, więc lepiej by było prawdą), x & (width - 1) jest w większości równoważne x % width, z tym że działa również dla ujemnego x (podczas gdy x % width z ujemnym x miałoby ujemny wynik) i prawie na pewno jest szybszy.

Albo umieścić go wizualnie przykład, powiedzmy width = 64 i x = 64+12 = 76, następnie

x  = 00000000 00000000 00000000 01001100 
w  = 00000000 00000000 00000000 01000000 
w-1  = 00000000 00000000 00000000 00111111 
x & w-1 = 00000000 00000000 00000000 00001100 = 12 

Jak widać z postaci w-1 operacja x & w-1 jest jak tylko dolne bity x, zakładając oczywiście, że w jest wciąż potęgą dwóch. Tak więc bity z wagami 64 i wielokrotnościami 64 są usuwane, tak jak prawdziwa operacja "modulo 64" (która nie jest % w C#, jeśli pracujesz ze znakowanymi liczbami całkowitymi, to jest reszta).