bitwise&在此声明中的功能是什么?

cam*_*s95 5 c# algorithm bitwise-operators bitwise-and

我一直在阅读C#中的菱形平方算法的实现,它围绕创建无缝纹理.为了计算下一个点,采用以正方形或菱形排列的四个采样点的平均值.如果样本点位于纹理边缘,则将其缠绕到另一侧.此包装似乎使用以下方法完成:

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

一点点的研究告诉我这是一个有点操作员.我之前没有使用它们,维基百科的文章也没有启发.有人可以解释&操作员在这种方法中做了什么吗?

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

har*_*old 8

这是为了"包装".假设width并且height是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
Run Code Online (Sandbox Code Playgroud)

正如你从形式中看到的那样w-1,操作x & w-1就像只取下底部位x,假设当然w仍然是2的幂.因此,删除权重为64和64的倍数的位,就像真正的"模64"操作一样(%如果使用有符号整数,则不在C#中,这是余数).