Sign in to follow this  
Followers 0

Использование всех 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 байта сэкономлено.

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 бит).

Edited by Cawfee
Причина: исправление опечатки.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.