Поиск в MySQL + PHP по статусу бита

Я пытался сделать это целый день без удачи.

Краткое объяснение: у меня есть игровая система, в которой мы сопоставляем, может ли кто-то атаковать или нет, выполняя поиск по полю своих способностей.

To be able to use the "flame" skill you need to "know" how to do it, it requires the 7th and the 1st bit ON (10 bits): 0000000101

And this would be a player "knowledge" field where we put 1s if they did some work before (10 bits where 1st bit is fire, second bit is ice, third bit is sorcery and so on): 0010110101

Моя проблема начинается, когда я пытаюсь сравнить, знает ли игрок этот навык или нет, поскольку я не смог просто сравнить, включен 1-й или 3-й бит или выключен.

Это был бы идеальный пример:

Навык огня: XXXXXXX1X1
Знание: 1X1XX1X1X1

В этом примере игрок сможет выполнить @fire attack @, потому что его первый и третий биты включены, даже если игрок «знает» много других вещей (10-е, 8-е, 5-е строжайше).

Разделение всего на 10 различных полей не вариант, так как он уже работает и потребует много работы, чтобы изменить все остальное.

Я надеюсь, что вы можете помочь мне, первый раз спрашивая, но годы, используя stackoverflow.

Благодарю.

0

Решение

Чтобы проверить, все ли биты в маске включены, используйте:

WHERE abilities & b'000000101' = b'000000101'

Чтобы проверить, включен ли какой-либо из битов, используйте:

WHERE abilities & b'000000101' != 0

Чтобы включить все биты в маске:

SET abilities = abilities | b'000000101'

Чтобы отключить их все:

SET abilities = abilities & ~b'000000101'

Эти битовые функции документированы Вот

1

Другие решения

В MySQL вы можете сравнить биты по

SELECT (b'0000000101' & b'1010010101')

Например.

Таким образом, чтобы проверить, знает ли игрок лед, вы можете сделать b'0000000010

Конечно, если количество умений превышает количество доступных битов, вам нужно будет что-то изменить.

Либо укусите маркер и добавьте дополнительные поля, либо увеличьте двоичное поле в таблице, используя больший тип данных.

Этот второй вариант может потребовать некоторой работы по преобразованию старых типов данных в новые.

0

По вопросам рекламы [email protected]