[Tutorial] 32 слота одной переменной
#1

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

pawn Code:
new bool:Arr0;
new bool:Arr1;
new bool:Arr2;
//и т.д. до 32
Это заняло бы у нас 128 байт (4*32)

В нашем-же случаи нужна всего одна переменная:
pawn Code:
new Arr;
И на этом мы сэкономим 124 байт. Довольно не мало — согласитесь.
А затратили мы на 32 слота — 4 байта, всего по 1 биту на слот.

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


И решил я написать несколько макросов для использования всей этой фигни
С их помощью возможно изменять значение на 1 или 0 (true | false) для каждого слота.
А так-же узнать заполнен-ли определённый слот.
*
*
*

Описание:
  • variable — переменная
  • slot — слот (0..31)
  • 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)
pawn Code:
#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
Вот и решайте, использовать 64 переменных типа bool занимая 265 байт(2120 бит) либо
использовать данные макросы имея всё те-же 64 слота, а занимая всего 8 байт(64 бит).

Автор: SoNik))
Reply
#2

Где-то я уже это видел.
Reply
#3

Топикстартер открыл для себя бинарную арифметику?!
Reply
#4

https://sampforum.blast.hk/showthread.php?tid=332649 вот тут, наверное, я видел.
Reply
#5

Увидев несколько макросов подумал, зачем мне 1..15 числа на 8 слотов, если нужно всего-то 0..1 да и слотов явно будет больше. Изучил побитовые операторы и сделал то, что меня интересовало не видя не единой темы с манипуляциями по 1 биту.
Reply
#6

Скоро изобретут BCD числа
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)