我想知道如何将 "a-(a%b) " 转换为 "a&(~b)"(捕捉网格公式)

I want to know how transformed "a-(a%b) " to "a&(~b)" (snapping grid formula)

当我搜索捕捉网格功能时。其实就是Tile Collide。(你可能知道我学GMS2是因为tags..)

这对我的问题不重要。

切入正题,我了解了这个公式。

pos.x - (pos.x % gridwidth)  <- this is number calculation.

我想要的效果很好。我发现了不同的公式。

此公式适用于对象和图块的碰撞。

(pos.x)&~(gridwidth-1)    <- this is binary calculation.

它有同样的工作。发生什么事??看不懂这些公式是怎么转换的..

实际上我知道“&”与减法有相同的作用。 但是其他的我不懂。

例如

var f1,f2;
var pos_x = 102;
var gridwidth = 64; // It must be even power of 2.
f1 = pos_x - (pos_x % gridwidth);
f2 = (pos_x)&(~(gridwidth-1));

只有当 gridwidth 是 2 的偶次方时,这两个公式才等价,例如 128、256、2048 等。

在任何一种情况下,pos.x - (pos.x % gridwidth) 都会 floor 回到 gridwidth 的偶数倍,"snapping" 到该网格单元格的开始,其中网格由宽度为 gridwidth.

的单元格组成

如果您可以假设 gridwidth 是 2 的偶数次方,那么 (pos.x)&~(gridwidth-1) 就是做同样的事情。基本上,在这个假设下,一个网格单元中的每个值只会在其低阶位上有所不同...... gridwidth 位以下的位。此代码只是清除这些位,从而将结果计算为 gridwidth 的偶数倍,这将是该网格单元格中的第一个位置。