13.10.2013, 08:57
(
Последний раз редактировалось WLSF; 04.11.2013 в 04:35.
)
Introduзгo
O que й o ibits ? ele й um manipulador de bits, funciona de forma que vocк consiga executar as mesmas operaзхes com manipulaзгo de variбveis, sу que com uma certa economia em questгo bytes.
Ele estб sendo lanзado como versгo de testes, entгo hб possibilidades de sofrer alteraзхes futuramente para melhorar sua sintaxe e possivelmente seu funcionamento.
Include
ibits.inc
O ibits foi separado por:
O uso da include й simples e de fбcil compreensгo.
Para os muitos que nгo entendem do assunto, eu vou explicar de uma forma bem simples.
Quando vocк cria um vetor com valor de MAX_PLAYERS, vocк estб criando uma variбvel
que suportarб 32 bits multiplicados pelo tamanho dela, MAX_PLAYERS = 500,
logo temos 500 valores de 32bits, oque seria um valor muito, muito grande, que muitas vezes nгo sгo utilizados nem 30% disto.
Exemplo de uso visto normalmente:
Em muitas vezes vocкs utilizam coisas do gкnero, onde vocк criou um vetor de 500 valores, onde cada valor contйm 32 bits.
Quando vocк seta o valor da variбvel admin para 5, vocк estб alterando o valor de nulo para:
Como vocкs podem perceber, 5 (101 em binбrio) foi um valor muito repugnante setado perto dos 32 bits. Isso indica que vocк alterou 3 bits apenas, lhe restando mais 29 sem uso, que normalmente nunca sгo utilizados ao longo do cуdigo inteiro.
Isso faz com que vocк ocupe mais memуria do que o necessбrio na maioria dos casos.
Utilizando ibits, vocк poderб manter o controle disto.
Percebam a diferenзa logo no inicio, nгo temos mais um vetor de 500 valores, mas sim de 250, a metade do que havнamos requisitado no teste passado.
Eu setei 2 jogadores(0 e 1) para admin nнvel 5, percebam a diferenзa dos bits:
Percebam que o nъmero dos bits utilizados aumentou, pois eu setei 2 valores com um certo X limite de possibilidades para uma mesma variбvel, apenas alterando sua posiзгo na escala dos bits.
Isto faz com que possamos utilizar variбveis com valores normais economizando memуria.
Exemplo de uso:
Criando 'sistema' de admin, utilizando icmd 7.0
Notas finais
O ibits foi feito de forma simples, mas mantendo o foco na qualidade, como estб versгo й apenas um teste,
a prуxima e possнvel atualizaзгo terб funcionalidades extras para melhor manipulaзгo dos dados.
Como vocкs viram, й sim algo de grande utilidade.
Crйditos
O que й o ibits ? ele й um manipulador de bits, funciona de forma que vocк consiga executar as mesmas operaзхes com manipulaзгo de variбveis, sу que com uma certa economia em questгo bytes.
Ele estб sendo lanзado como versгo de testes, entгo hб possibilidades de sofrer alteraзхes futuramente para melhorar sua sintaxe e possivelmente seu funcionamento.
Include
ibits.inc
pawn Код:
/*
* --- iBits ---
* Por Willian Luigi
* Atualizado - [15/10/2013]
* Atualizado - [04/11/2013]
* [iPs]TeaM
* mixmusicas.com.br ipsbr.net
*
*/
#if defined _ibits_included
#endinput
#endif
#define _ibits_included
#pragma library ibits
enum IPSI_BITS (<<=1)
{
bit16 = 2,
bit8,
bit4,
bit2,
bit1
};
stock partBits(n,inicio,fim) {
return (n >> inicio) & ~(~0 << (fim - inicio + 1));
}
// 1 bit
#define array_bit1:%0<%1,%2> \
%0[(%1 + cellbits) / cellbits][(%1 + cellbits) / cellbits]
#define bit1:%0<%1> \
%0[(%1 + cellbits) / cellbits]
#define getBit1(%0,%1) \
( ( %0[%1 / cellbits] >> %1 ) & 0x01 )
stock setBit1(arr[], slot, val)
{
return val ? (arr[slot / cellbits] ^= ((_:val % 0x02) << slot)) : (arr[slot/cellbits] &= ~(0x01 << slot));
}
// 2 bits
#define bit2:%0<%1> \
%0[(%1 + _:bit2) / _:bit2]
#define getBit2(%0,%1) \
( %0[%1 / _:bit2] >> ( %1 << 1 ) ) % 0x04
stock setBit2(arr[], slot, val)
{
return arr[slot/_:bit2] = ((arr[slot/_:bit2] & ~(0x03 << (slot << 1)))) | ((_:val % 0x04) << (slot << 1));
}
// 4 bits
#define bit4:%0<%1> \
%0[(%1 + _:bit4) / _:bit4]
#define getBit4(%0,%1) \
( %0[%1 / _:bit4] >> ( %1 << 2 ) ) % 0x10
stock setBit4(arr[], slot, val)
{
return arr[slot/_:bit4] = ((arr[slot/_:bit4] & ~(0xF << (slot << 2)))) | ((_:val % 0x10) << (slot << 2));
}
// 16 bits
#define bit16:%0<%1> \
%0[(%1 + _:bit16) / _:bit16]
#define getBit16(%0,%1) \
( %0[%1 / _:bit16] >> ( %1 << 4 ) ) % (65536)
stock setBit16(arr[], slot, val)
{
return arr[slot/_:bit16] = ((arr[slot/_:bit16] & ~(65535 << (slot << 4)))) | ((_:val % 65536) << (slot << 4));
}
//geral bits
#define bit_var%0<%1@%2> \
new %0[(%1 + _:%2) / _:%2]
#define bit_var_set:%3(%0,%1,%2) \
setBit%3(%0,%1,%2)
#define bit_var_get:%2(%0,%1) \
getBit%2(%0,%1)
#define bit_array%0<%1,%2@%3> \
new %0[(_:%1)][(_:%2 + _:%3) / _:%3]
#define bit_array_set:%4(%0,%1,%2,%3) \
setBit%4(%0[%1],_:%2,%3)
#define bit_array_get:%3(%0,%1,%2) \
getBit%3(%0[%1],_:%2)
// funcionalidades
#define size(%0,%1) \
(sizeof(%0) * _:%1) //Retorna o tamanho da estrutura
stock bool:any(arr[], slot, IPSI_BITS: type) //Verifica se algum bit da sequкncia estб ativo(1)
{
switch(_:type)
{
case bit16: return bool:(getBit16(arr, slot) ^ 0b0) && 1;
case bit4: return bool:(getBit4(arr, slot) ^ 0b0) && 1;
case bit2: return bool:(getBit2(arr, slot) ^ 0b0) && 1;
case bit1: return bool:(getBit1(arr, slot) ^ 0b0) && 1;
default: return false;
}
return false;
}
stock bool:none(arr[], slot, IPSI_BITS: type) //Verifica se nenhum bit da sequкncia estб ativo(1)
{
switch(_:type)
{
case bit16: return bool:(!(getBit16(arr, slot) ^ 0b0)) && 1;
case bit4: return bool:(!(getBit4(arr, slot) ^ 0b0)) && 1;
case bit2: return bool:(!(getBit2(arr, slot) ^ 0b0)) && 1;
case bit1: return bool:(!(getBit1(arr, slot) ^ 0b0)) && 1;
default: return false;
}
return false;
}
O ibits foi separado por:
Код:
1 bit | Variбveis booleanas, sу recebem 1 ou 0 2 bits | Variбveis que aceitam atй 3 valores(0, 1, 2, 3) 4 bits | Variбveis que aceitam atй 15 valores. 16 bits | Variбveis que aceitam atй 65535 valores.
Para os muitos que nгo entendem do assunto, eu vou explicar de uma forma bem simples.
Quando vocк cria um vetor com valor de MAX_PLAYERS, vocк estб criando uma variбvel
que suportarб 32 bits multiplicados pelo tamanho dela, MAX_PLAYERS = 500,
logo temos 500 valores de 32bits, oque seria um valor muito, muito grande, que muitas vezes nгo sгo utilizados nem 30% disto.
Exemplo de uso visto normalmente:
pawn Код:
new admin[MAX_PLAYERS]; // 500
admin[playerid] = 5;
Код:
00000000000000000000000000000000 //32 bits
Код:
00000000000000000000000000000101 //32 bits
Isso faz com que vocк ocupe mais memуria do que o necessбrio na maioria dos casos.
Utilizando ibits, vocк poderб manter o controle disto.
pawn Код:
new bit4:admin<MAX_PLAYERS>; // 250
setBit4(admin, 0, 5); //player 0
setBit4(admin, 1, 5); //player 1
Eu setei 2 jogadores(0 e 1) para admin nнvel 5, percebam a diferenзa dos bits:
Код:
00000000000000000000000001010101 //32 bits
Isto faz com que possamos utilizar variбveis com valores normais economizando memуria.
Exemplo de uso:
Criando 'sistema' de admin, utilizando icmd 7.0
pawn Код:
new bit4: admin <MAX_PLAYERS>;
new bit1: adminTrabalhando <MAX_PLAYERS>;
public OnPlayerCommandText(playerid, commandid, params[])
{
switch(commandid)
{
case iscmd("t,r,a,b,a,l,h,a,r"):
{
//seta a booleana do admin trabalhando para a inversa do valor antigo.
setBit1(adminTrabalhando, playerid, !getBit1(adminTrabalhando, playerid));
}
case iscmd("m,a,t,a,r"):
{
if (!params[0]) SendClientMessage(playerid, -1, "Syntax: /matar [id]");
//lendo valor da variбvel admin do playerid, para saber se ele tem nнvel..
if (!getBit4(admin, playerid)) SendClientMessage(playerid, -1, "Vocк nгo й um admin.");
//Lendo valor da var adminTrabalhando, para saber se ele estб em modo de trabalho.
if (!getBit1(adminTrabalhando, playerid)) SendClientMessage(playerid, -1, "Vocк nгo estб em modo trabalho.");
SetPlayerHealth(strval(params), 0.0);
}
case iscmd("a,d,m,i,n"):
{
if (!params[0]) SendClientMessage(playerid, -1, "Syntax: /admin [value]");
if (0 > strval(params) > 5) SendClientMessage(playerid, -1, "Nнvel invбlido.");
//setando valor da variбvel para a quantidade digitada
setBit4(admin, playerid, strval(params));
SendClientMessage(playerid, -1, "Vocк alterou seu nнvel de admin.");
}
}
}
Notas finais
O ibits foi feito de forma simples, mas mantendo o foco na qualidade, como estб versгo й apenas um teste,
a prуxima e possнvel atualizaзгo terб funcionalidades extras para melhor manipulaзгo dos dados.
Como vocкs viram, й sim algo de grande utilidade.
Crйditos
- Willian Luigi
- ipsBruno
- [iPs]TeaM