2017-10-13 88 views
5

我一直在閱讀關於C#中菱形方塊算法的implementation,這些算法用於創建無縫紋理。爲了計算下一個點,平均取四個採樣點排列在正方形或菱形中。如果採樣點位於紋理的邊緣,則會纏繞到另一邊。這個包裝似乎是用下面的方法完成的:在本聲明中,按位&的功能是什麼?

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

有點研究告訴我這是一個按位運算符。我以前沒有用過它們,wikipedia article也沒有啓發。有人可以解釋一下&運營商在這個方法中做了什麼?

編輯:紋理尺寸總是兩個冪

回答

8

這是用於「包裝」。假設widthheight是兩個冪(否則它不起作用,所以最好是真的),x & (width - 1)大多相當於x % width,除了它也適用於負x(而x % widthx會有一個負面結果),幾乎肯定會更快。

或用一個例子來把它在視覺上,說width = 64x = 64+12 = 76,然後

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

正如你可以從w-1形式看,操作x & w-1就像是隻取的x底位,假設當然那w仍然是兩個冪。因此,權重64和64的倍數的位被刪除,就像真正的「模64」操作一樣(如果使用帶符號整數,那麼C#中不是%,這是餘數)。