Taigi, ką noriu papasakoti šioje pamokoje yra kaip saugoti keletą true/false reikšmių viename kintamajame.
Visų pirma, apžvelgsiu keletą sąvokų:
Sąvoka | Reikšmė |
---|---|
Bit'as | Informacijos vienetas, kuris gali būti lygus tik 1 arba 0 (true arba false) |
Kintamasis | Jame laikomas skaičius, kuris yra išreiškiamas bit'ais |
Taigi, PAWN kalboje, kintamasis yra sudarytas iš 32 bitų. Kiekvienas bitas turi savo vietą ir priklausomai nuo jo vietos, jis turi kažkokią reikšmę.
Bitų reiškmės yra tokios:
Viršuje esantys vienetai, yra bitai, kurių reikšmė nustatyta į 1, t.y. true. Jeigu skaičius susideda iš 32 bitų, ir nei vienas bitas nėra įjungtas, tuomet skaičius išreikštas bitais PAWN kalboje atrodo taip: 0b00000000000000000000000000000000
. 0b pradžioje parodo, kad norime parašyti skaičių bitais, o sekantys 32 skaičiai kurie gali būti tik 1 arba 0 parodo kokie bitai yra įjungti šiame skaičiuje. Paskutinio bito reikšmė yra 1, ir artėjant link pradžios kiekvieno bito reikšmė didėja x2 (kaip pavaizduota paveiksliuke esančiam aukščiau).
Skaičius | išreikštas bitais |
---|---|
1 | 0b00000000000000000000000000000001 |
2 | 0b00000000000000000000000000000010 |
4 | 0b00000000000000000000000000000100 |
3 | 0b00000000000000000000000000000011 |
Kas mums iš to? Ogi tai, kad mes kintamajame galime saugoti ne skaičių, bet 32 boolean reiškmės (true arba false).
Tai reiškia, kad vietoj to, kad rašytum
new bool:zaidejas_Mires [MAX_PLAYERS];
new bool:zaidejas_Turi_VIP [MAX_PLAYERS];
new bool:zaidejas_Negali_Kalbeti [MAX_PLAYERS];
zaidejas_Mires[playerid] = true;
gali viską surašyti į vieną kintamajį:
enum (*= 2) { // *= 2 kad kiekvienas sekantis enumo elementas įgautų dvigubai didesnę reikšmę negu prieš jį buvęs
Mires = 1, // nes bitai prasideda nuo 1
Turi_VIP, // 2
Negali_Kalbeti // 4
};
new zaidejas[MAX_PLAYERS];
zaidejas[playerid] |= Mires;
Bitų operacijų paaiškinimas:
zaidejas[playerid] |= Mires; // Bitą įjungia
if(zaidejas[playerid] & Mires) // Patikrina ar bitas įjungtas
zaidejas[playerid] &= ~Mires; // Bitą išjungia
Kad nereiktų šitų simbolių rašinėti kiekvieną kartą, galima susikurti trumpinius, pvz
#define getBit(%0,%1) ((%0) & (%1))
#define setBit(%0,%1,%2) (%2)?((%0)|=(%1)):((%0)&=~(%1))
setBit(zaidejas[playerid], Mires, true);
if(getBit(zaidejas[playerid], Mires))
Jeigu yra klausimų, klauskit :)
Bit prieš 9 metus
Kaip suprasti bitą įjungia ir pan. Gali išsamiau gal biški išaiškint šitą reikalą? :+1: