2017-10-13 49 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#中不是%,这是余数)。