我一直在阅读C#中的implementation菱形平方算法,它包裹着创建无缝纹理。为了计算下一个点,采用以正方形或菱形排列的四个采样点的平均值。如果样本点位于纹理边缘,则将其缠绕到另一侧。这种包装似乎是使用以下方法完成的:
public double sample(int x, int y)
{
return values[(x & (width - 1)) + (y & (height - 1)) * width];
}
一些研究告诉我这是一个有点操作员。我之前没有使用它们,wikipedia article没有启发。有人可以解释&
运算符在此方法中的作用吗?
编辑:纹理尺寸始终为2的幂
答案 0 :(得分:8)
" wrap"。假设width
和height
是2的幂(否则它不起作用,最好是真的),x & (width - 1)
大部分等同于x % width
,除了它也适用于否定x
(而x % width
带有负x
会产生负面结果),几乎肯定会更快。
或者通过示例直观地说明width = 64
和x = 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#中不是%
,这是一个余数。