Sign in to follow this  
Followers 0
20th century

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

1 post in this topic

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


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

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

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


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

Используя данное готовое решение нам понадобится лишь одна переменная, в итоге 124 байта сэкономлено.
Затратили мы на 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 бит).

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   You have pasted content with formatting.   Remove formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

Loading...
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.