Я хочу знать, как преобразовать "a-(a%b)" в "a&(~b)" (формула привязки сетки)

Когда я ищу функцию сетки привязки. На самом деле это 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));

почему теги python и C# одновременно? Что это за язык?

Paritosh Singh 07.04.2019 19:06

GML — это скриптовый язык для GameMaker Studio2. Я думал, что GML основан на Python… просто мое предположение. Извините, если вы запутались в этом. И я удаляю тег С# из-за путаницы.

JINU_K 07.04.2019 19:12

Должна ли ширина сетки быть четной степенью числа 2? Только так я вижу смысл во второй формуле. - если это так, то оба они «привязываются» к кратному четной степени двойки, причем эта четная степень двойки равна gridwidth.

CryptoFool 07.04.2019 19:20

предоставить потенциальные значения для pos.x и ширины сетки? потому что эти две формулы совсем не эквивалентны. например, с 10 и 3 x - (x % gridwidth) #9 и (x)&~(gridwidth-1) #8

Paritosh Singh 07.04.2019 19:22

О, я вижу .. Я добавил пример того, что я сделал для этого.

JINU_K 07.04.2019 19:32

Прохладный. Итак, мой ответ объясняет, что происходит, достаточно хорошо, чтобы вы это поняли?

CryptoFool 07.04.2019 19:37

Да!! Моя проблема решена, спасибо за вас.

JINU_K 07.04.2019 19:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Спасибо за Ваш ответ. Как вы сказали, вторая формула работает так же, как и первая формула, когда gridwidth имеет четное число.

JINU_K 07.04.2019 19:45

Однако не просто любое четное число ... только четная степень 2. Это не будет работать для ширины сетки 10 или 1000. - Я полагаю, что вы это имели в виду. Всего лишь уточняю.

CryptoFool 07.04.2019 19:57

Другие вопросы по теме