按位和&的功能是什么?在这个声明中?

时间:2017-10-13 08:41:38

标签: c# algorithm bitwise-operators bitwise-and

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

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

一些研究告诉我这是一个有点操作员。我之前没有使用它们,wikipedia article没有启发。有人可以解释&运算符在此方法中的作用吗?

编辑:纹理尺寸始终为2的幂

1 个答案:

答案 0 :(得分:8)

" wrap"。假设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的倍数的位,就像真正的"模64"如果你正在使用有符号整数,则操作将在C#中不是%,这是一个余数。