20th century

Использование всех 32 слотов переменной

В теме 1 сообщение

Использование всех 32 слотов переменной.
Автор: SoNik)) aka SoNy


Общее описание:

Данное готовое решение поможет вам помещать несколько значений в одну переменную.

new bool:var1;
new bool:var2;
new bool:var3;
// и т.д. до 32.

В итоге 32 переменные заняли бы у нас 128 байт (4 байта * 32 переменные).



Используя данное готовое решение нам понадобится лишь одна переменная, в итоге 124 байта сэкономлено.

new var;


Затратили мы на 32 слота переменной - 4 байта, всего по одному биту на слот.

1 байт = 8 бит
4 байт = 32 бит

Автор данного готового решения предоставляет нам несколько макросов, с помощью которых можно взаимодействовать с нашими слотами.


Вы можете изменять значения на 1 или 0 (true | false) для каждого из слотов, а также узнавать, заполнен ли в данный момент слот.

Описание макросов:

  • variable — переменная
  • slot — слот переменной

 

  • setBit_1(variable, slot);    — устанавливает true(1) в заданный слот
  • setBit_0(variable, slot);    — устанавливает false(0) в заданный слот
  • getBit(variable, slot); * *   — возвращает: true(1) - слот заполнен, false(0) - слот пустой
  • addBit(variable); * * *        — устанавливает все слоты (0..31) в true(1)
  • delBit(variable); * * *         — устанавливает все слоты (0..31) в false(0)

 

#define setBit_1(%1,%2)         %1|=(1<<%2)
#define setBit_0(%1,%2)         %1&=~(1<<%2)
#define getBit(%1,%2)           ((1<<%2)&%1?1:0)
#define addBit(%1)              %1=-1
#define delBit(%1)              %1=0


Пример использования:

#define SETTING_GLOBAL_CHAT 0 // минимальный слот.
#define SETTING_GROUP_CHAT 15 
#define SETTING_PLAYER_CHAT 31 // максимальный слот.
new pSettings[MAX_PLAYERS];

command.on(playerid)
{
    // some code..
    setBit_1(pSettings[playerid], SETTING_GLOBAL_CHAT);
    return true;
}

command.off(playerid)
{
    // some code..
    setBit_0(pSettings[playerid], SETTING_PLAYER_CHAT);
    return true;
}

if(getBit(pSettings[playerid], SETTING_GROUP_CHAT)) return SendClientMessage(playerid, -1, "true");
    else return SendClientMessage(playerid, -1, "false");

addBit(pSettings[playerid]); // заполнение слотов.

// some code..

delBit(pSettings[playerid]); // очистка слотов.


Решение за вами: использовать 64 переменной типа bool занимая 256 байт (2120 бит), либо
использовать данные макросы имея всё те-же 64 слота, а занимая всего 8 байт (64 бит).

Отредактировано пользователем Cawfee
Причина: исправление опечатки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу