Работа с битами - объяснить подробнее

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
27
Реакции
15
Добрый вечер всем форумчанам. Нуждаюсь в вашей помощи т.к начал работать с битсуммами.
Положение у меня таково
Имеется небольшой кусочек кода

C++:
Три препроцессорника
#define GetBit(%1,%2) (%1 & (1 << (%2 & 31)))
#define SetBit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define ResetBit(%1,%2) (%1 &= ~(1 << (%2 & 31)))

Небольшое условие
if(!is_user_connected(id) || !is_user_alive(id)) {
    Тут часть кода
}
else {
    Тут часть кода
}
Проблема вот в чем
Пытаясь поработать с данными препроцессорами не понял как их использовать
Либо на отрицание брать препроцессор ResetBit либо использовать с отрицанием GetBit
C++:
Три препроцессорника
#define GetBit(%1,%2) (%1 & (1 << (%2 & 31)))
#define SetBit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define ResetBit(%1,%2) (%1 &= ~(1 << (%2 & 31)))

Небольшое условие
if(/*Либо ResetBit*/!(GetBit(g_BitsIsUserConnected, id)) || /*Либо ResetBit*/!(g_BitsIsUserAlive, id)) {
    Тут часть кода
}
else {
    Тут часть кода
}
Может кто-то подробнее объяснить эту всю кашу с битами?
Работу побитовых операторов знаю.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
В условии нужно GetBit. ResetBit сбрасывает бит в 0, SetBit устанавливает 1.

А судя по тому что вы собрались проверять на присоединен игрок или живой, то лучше вообще отбросьте все эту работу с битами и используйте нормальный 33 мерный булев массив. И вот такие вопросы отпадут у вас и у тех кто будет читать ваш код. И я надеюсь что кэшировать состояние вы собрались для использования в высокочастотных хуках (фуллпак например), а не просто так.
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
set - устанавливает бит.
reset - убирает бит.
get - проверяет наличие бита.

Переменная:
new g_BitsIsUserAlive

При спавне:
SetBit(g_BitsIsUserAlive,id)

При смерти:
ResetBit(g_BitsIsUserAlive,id)

Проверка наличия бита (жив ли игрок?):
Код:
if( GetBit(g_BitsIsUserAlive,id) )
    // бит есть, игрок жив
else
    // бита нет, игрок мертв
или
Код:
if( !GetBit(g_BitsIsUserAlive,id) )
    // бита нет
Так как игрок может выйти не умерев, также надо убирать бит при выходе игрока.

Бонус:
т.к. g_BitsIsUserAlive == 0 только если не установлено ни одного бита, то g_BitsIsUserAlive != 0 означает что 1 или более игроков жив/ы. Иногда это свойство особенно полезно.
 
Сообщения
9
Реакции
-7
Доступ к битам или доступ к массиву? быстрее?
 
Сообщения
27
Реакции
15
fantom, Именно Фуллпак.
Ayk, Спасибо за такой развернутый ответ.
Еще возник вопрос. Про инвертирование бита(XOR)
3 Ноя 2019
Lancer, Смотря какая цель для бит и для массива.
Если уж просто делать проверки бит операции выигрывают ( сугубо мое личное мнение ).
Если идет присваивание массивы выигрывают ( и тоже сугубо мое мнение)
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
почему вы используете биты там где не надо?
 
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
Сообщения
27
Реакции
15
fl0wer, steelzzz, Это просто условие, чтобы понять как работать с этими препроцессорами, а так у меня на это совсем другие цели.
4 Ноя 2019
d3m37r4, Спасибо за этот тутор. Вытащил некоторые нюансы для себя.
4 Ноя 2019
Появился еще вопрос с инвертированием битов. В каких случаях лучше его использовать?
#define InvertBit(%1,%2) (%1 ^= (1 << (%2 & 31)))
 
Сообщения
27
Реакции
15
steelzzz, Что за подколы? Разве нельзя поучится поработать с битсуммами в таком формате? или пример слишком глупый был?
И этих вип меню навалом в паблике, зачем создавать велосипед ?
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Появился еще вопрос с инвертированием битов. В каких случаях лучше его использовать?
Было 1 стало 0, или наоборот было 0 стало 1. Например пользователь в меню может переключить on/off какую то настройку.
 
  • Нравится
Реакции: Ayk
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу