这条语句中按位 & 的作用是什么?

What is the function of bitwise & in this statement?

我一直在阅读有关 implementation 的 C# 菱形方形算法,该算法环绕创建无缝纹理。为了计算下一个点,对排列成正方形或菱形的四个样本点取平均值。如果样本点位于纹理的边缘,则它会环绕到另一侧。这种包装似乎是使用以下方法完成的:

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

一些研究告诉我这是一个按位运算符。我以前没有用过它们,wikipedia article 没有启发性。有人可以解释一下 & 运算符在这个方法中做了什么吗?

编辑:纹理尺寸总是二的幂

这是给 "wrapping" 的。假设 widthheight 是 2 的幂(否则它不起作用,所以最好是真的),x & (width - 1) 基本上等同于 x % width,除了它也适用于负数 x(而 x % width 和负数 x 会产生负数结果)并且几乎肯定更快。

或者用一个例子直观地表达,说 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 的倍数的位,就像真正的 "modulo 64" 操作一样(如果您使用的是有符号整数,则在 C# 中不是 %,这是余数)。