Java 菱形平方算法实现中用位运算符理解数组访问

Java 菱形平方算法实现中用位运算符理解数组访问,java,arrays,algorithm,bitwise-operators,Java,Arrays,Algorithm,Bitwise Operators,问题是,在Notch的“微型飞行器”中,哪一个引用了该技术的实现。完整的源代码是可用的 我不明白用于访问和更改值数组的方法是如何工作的 给定指定的宽度和高度,我们初始化一个名为长度宽度*高度值的双一维数组,并使用以下方法访问和更改点的值(x,y): 我不理解操作x&(width-1)和y&(height-1)的目的,特别是考虑到,据我所知,width和height应该相等,这样算法才能正常工作。如果是这种情况,操作不应该每次都返回0(极端情况除外),因为x

问题是,在Notch的“微型飞行器”中,哪一个引用了该技术的实现。完整的源代码是可用的

我不明白用于访问和更改值数组的方法是如何工作的

给定指定的
宽度
高度
,我们初始化一个名为
长度
宽度*高度
值的
一维数组,并使用以下方法访问和更改点的值
(x,y)

我不理解操作
x&(width-1)
y&(height-1)
的目的,特别是考虑到,据我所知,
width
height
应该相等,这样算法才能正常工作。如果是这种情况,操作不应该每次都返回
0
(极端情况除外),因为
x
y


消息来源提到,这些方法具有“允许地形完美包裹生成纹理边缘的副作用”,但我不明白这是如何实现的。

它适用于宽度和高度为2^n的情况,如宽度为256时,宽度-1将为255,一个逻辑and和255的任意值将在0和255的范围内,右包装。这是有效的。我没有意识到让数组环绕可以使算法在2^n的大小下工作:“缺失”值只是从相反的边上选择的。
public double sample(int x, int y) {
    return values[(x & (width - 1)) + (y & (height - 1)) * width];
}

public void setSample(int x, int y, double value) {
    values[(x & (width - 1)) + (y & (height - 1)) * width] = value;
}