Я хочу знать, как преобразовать «a- (a% b)» в «a & (~ b)» (формула привязки сетки) - PullRequest
3 голосов
/ 07 апреля 2019

Когда я искал о функции привязки сетки. На самом деле это Tile Collide. (Возможно, вы знаете, что я изучаю GMS2 из-за тегов ..)

Это не важно для моего вопроса.

В погоне, я узнал об этой формуле.

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));

1 Ответ

2 голосов
/ 07 апреля 2019

Эти две формулы эквивалентны, только если gridwidth является четной степенью двойки, например 128, 256, 2048 и т. Д.

В любом случае pos.x - (pos.x % gridwidth) возвращает floor обратно к четному кратному gridwidth, «привязывая» к началу этой ячейки сетки, где сетка состоит из ячеек ширины gridwidth.

Если вы можете предположить, что gridwidth - это четная степень 2, то (pos.x)&~(gridwidth-1) делает то же самое. По сути, учитывая это предположение, каждое значение в одной ячейке сетки будет отличаться только битами младшего разряда ... битами ниже бита gridwidth. Этот код просто очищает эти биты, таким образом вычисляя результат, чтобы он был кратным gridwidth, который будет первой позицией в этой ячейке сетки.

...