PDA

Просмотр полной версии : [Урок] Побитовые операторы



Pop
07.11.2013, 00:31
И так хочу вам рассказать про битовые оператора и как их можно использовать в pawn для новичков в этом :)))

Существуют такие побитовые операторы как:
| ИЛИ
& И
^ Исключающее ИЛИ
~ Отрицание
<< сдвиг влево
>> сдвиг вправо

В Pawn языке используются ячейки. в 1 ячейки 4 байта, в каждом байте 8 бит, 1 бит это 0(ложь) или 1(истина)

1 ячейка может хранить число от -2 147 483 647 до 2 147 483 647

Так как в ячейке используется десятичные цифры, чтобы записать в ячейку битовое(двоичное) число перед числом нужно ввести 0b

new chislo = 0b11111111; // в десятичной системе это число выглядит так: 255

Рассмотрим оператор "|" (ИЛИ):
Если хоть один из битов равен 1 соответствующий ставится 1(истиной)
пример:

new a,b,с;
a = 0b10010; //
b = 0b10011; //
c = a|b; // в результате получим 0b11011
как так вышло:
// нули перед цифрами не пишутся, но процессор их видит так)
/*
a = 00000000 00000000 00000000 00010010
b = 00000000 00000000 00000000 00010011
c = 00000000 00000000 00000000 00010011
*/
Рассмотрим оператор "&" (И):
Любой бит равный 0 ставит соответствующий бит в 0(ложь)
пример:

new a,b,с;
a = 0b10010; //
b = 0b10011; //
c = a&b; // в результате получим 0b10010
как так вышло:
/*
a = 00000000 00000000 00000000 00010010
b = 00000000 00000000 00000000 00010011
c = 00000000 00000000 00000000 00010010
*/
Рассмотрим оператор "^" (Исключающее ИЛИ):
исключающее ИЛИ выдает истину, если только один из битов истинен
пример:

new a,b,с;
a = 0b11000; // число 8 в десятичной
b = 0b10011; //
c = a^b; // в результате получим 0b1011
как так вышло:
/*
a = 00000000 00000000 00000000 00011000
b = 00000000 00000000 00000000 00010011
c = 00000000 00000000 00000000 00001011
*/
Рассмотрим оператор "<<" (сдвиг влево):
Это просто) движение битов влево. (важно: при движении влево биты которые стояли слева сотрутся на количество сдвинутых бит)
пример:

new a,b;
a = 0b1000; // число 8 в десятичной
b = a<<2; // сдвинули на 2 бита влево
как так вышло:
/*
a = 00000000 00000000 00000000 00001000
b = 00000000 00000000 00000000 00100000
*/
Рассмотрим оператор ">>" (сдвиг вправо):

new a,b;
a = 0b1000; // число 8 в десятичной
b = a>>2; // сдвинули на 2 бита влево
как так вышло:
/*
a = 00000000 00000000 00000000 00001000
b = 00000000 00000000 00000000 00000010
*/
Рассмотрим оператор "~" (отрицание:


new a; // по умолчанию она в битах выглядит так 00000000 00000000 00000000 00000000
new b = ~a; // сделав отрицание все биты станут противоположны то есть так: 11111111 11111111 11111111 11111111

Как всё это можно использовать:
допустим в 1 ячейке хранить лицензии игрока

допустим

new licenze;
licenze = 0b001010 // допустим смотря справа налево лицензии А(нету) B(есть) C(нету) D(есть) E(нету) F(нету)
для проверки:

if(licenze & 1) SendClientMessage(playerid,-1,"У вас есть лицензия A");
if(licenze & (1<<1)) SendClientMessage(playerid,-1,"У вас есть лицензия B");
if(licenze & (1<<2)) SendClientMessage(playerid,-1,"У вас есть лицензия C");
if(licenze & (1<<3)) SendClientMessage(playerid,-1,"У вас есть лицензия D");
if(licenze & (1<<4)) SendClientMessage(playerid,-1,"У вас есть лицензия E");
if(licenze & (1<<5)) SendClientMessage(playerid,-1,"У вас есть лицензия F");
PS: Писал от руки не проверяя:) Тема будет дополнятся и исправляться

Unreal
23.10.2015, 19:50
а что будет если (?)

if(licenze & (0<<5))

L0ndl3m
24.10.2015, 00:06
Тоже самое, что и:

if(licenze & 0)
то есть ничего полезного.