06:55
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: Dima-kun  
[ Lesson ] Операторы в PAWN.
LatronДата: Понедельник, 06.02.2012, 14:21 | Сообщение # 1
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Автор урока: Latron

Всем привет,сегодня расскажу вам что такое операторы...

Отношения:


== - равно. Пример if( 1 == 1 ) - проверяет: равен ли один одному.
!= - не равно. Пример if( 2 != 1 ) - проверяет равна ли единица двум.
>= - больше либо равно. Пример if( 1 >= 2 ) - проверяет: больше ли или равна единица двум.
<= - меньше либо равно. Пример if( 1 <= 1 ) - проверяет: меньше ли или равен один одному.
> - больше. Пример if( 2 > 1 ) - проверяет больше ли два чем единица.
< - меньше. Пример if( 1 < 2 ) - проверяет меньше ли единица чем два.


Вычислительные операторы:


+ - сложение. Пример new var = 7 + 14; . Значение переменной var будет равно 21.
- - вычитание. Пример new var = 14 - 7; . Значение переменной var будет равно 7.
* - умножение. Пример new var = 7 * 3; . Значение переменной var будет равно 21.
/ - деление. Пример new var = 21 / 3; . Значение переменной var будет равно 7.
% - деление с остатком. Пример new var = 5 % 3; . Значение переменной var будет равно 1.


Логические операторы:


|| - Или. Пример if( 1 == 1 || 2 == 2 ) Условие: если единица равна единице ИЛИ два равно двум.
&& - И. Пример if( 1 == 1 && 2 == 2 ) Условие: если единица равна единице И два равно двум,только в этом случае оно сработает.
! - Нет. Пример if( !IsPlayerConnected( playerid ) ) Условие: если игрок не подключен к серверу.
= - Присвоение var = 333; . Присвоит var значение 333.
+= - Прибавление var += 333; . Прибавит к var 333.
-= - Вычитание var -= 333; . Вычтет из var 333.

В PAWN есть два нестандартных оператора, предназначенных для увеличения и уменьшения переменных. Оператор инкремента ++ добавляет 1 к своему операнду, а оператор декремента -- вычитает 1.
Нестандартность операторов ++ и -- в том, что их можно использовать и как префиксные (помещая перед переменной: ++var), и как постфиксные (помещая после переменной: var++) операторы. В обоих случаях значение n увеличивается на 1, но выражение ++var увеличивает var до того, как её значение будет использовано, а var++ - после того.

++ - Оператор инкремента.
new var = 2;
var++; увеличит значение var на единицу.

-- - Оператор инкремента.
new var = 2;
var--; уменьшит значение var на единицу.


Побитовые операторы:
( Спасибо toneysix )

& - побитовое И
| - побитовое ИЛИ
^ - побитовое исключающее ИЛИ.
<< - сдвиг влево.
>> - сдвиг вправо.
~ - побитовое отрицание (унарный).

Оператор & (побитовое И) часто используется для обнуления некоторой группы разрядов. Например

var = var & 0177;

обнуляет в var все разряды, кроме младших семи.

Оператор | (побитовое ИЛИ) применяют для установки разрядов; так,

var2 = var2 | SET_ON;
устанавливает единицы в тех разрядах var, которым соответствуют единицы в SET_ON.

Оператор ^ (побитовое исключающее ИЛИ) в каждом разряде установит 1, если соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.

Поразрядные операторы & и | следует отличать от логических операторов && и ||, которые при вычислении слева направо дают значение истинности. Например, если var равно 1, а var2 равно 2, то var & var2 даст нуль, а var && var2 - единицу.

Операторы << и >> сдвигают влево или вправо свой левый операнд на число битовых позиций, задаваемое правым операндом, который должен быть неотрицательным. Так, var3<< 2 сдвигает значение var3 влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению var3 на 4. Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины на одних машинах происходит с распространением знака ("арифметический сдвиг”), на других - с заполнением освобождающихся разрядов нулями ("логический сдвиг”).

Унарный оператор ~ поразрядно "обращает” целое т. е. превращает каждый единичный бит в нулевой и наоборот. Например
var = var & ~077
обнуляет в var последние 6 разрядов. Заметим, что запись var & ~077 не зависит от длины слова, и, следовательно, она лучше, чем var & 0177700, поскольку последняя подразумевает, что var занимает 16 битов. Не зависимая от машины форма записи ~077 не потребует дополнительных затрат при счете, так как ~077 - константное выражение, которое будет вычислено во время компиляции.

Дополнение от ZiGGi
Это может пригодиться для существенной экономии памяти. Например вам доступен 1 байт памяти и вам надо записать 2 числа в пределах 0..15. То вы с лёгкостью можете записать их в 1 байт.
Code
new x[1 char]; // создаём массив с 1 ячейкой размерностью в 1 байт
// запишем число 13 в правые 4 бита и цифру 6 в левые 4 бита
// 13 = 1101 (bin)
// 6 = 110 (bin)
x[0] = ((6 << 4)|(13)); // сдвигаем 3 бита цифры 6 в левую часть байта и ставим 4 бита числа 13 в правые 4 бита
// здесь рекомендуется сделать защиту "от дурака", который может
// попытаться записать в правую часть число размером более 4 битов
// делается это так: x = ((6 << 4)|(13 & 15));
// т.к. 15 == 1111 (bin), то мы обнуляем все биты, за этими пределами


После выполнения, x будет равняться 1101101 (bin).
Записали, теперь надо извлечь:
Code
printf("6 = %d",x[0] >> 4); // смещаем вправо на 4 бита, т.к. число 6 у нас в левой части байта
printf("13 = %d",x[0] & 15); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)



Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Сообщение отредактировал Latron - Воскресенье, 11.03.2012, 12:30
AlcoholikДата: Понедельник, 06.02.2012, 14:50 | Сообщение # 2
Мастер джэдай
Группа: Администратор
Сообщений: 8299
Награды: 111
Город: Санкт-Петербург
Репутация: 6085
Статус:
Какой это уже по счёту урок по операторам?


if(isset($beer)&&isset($girl)) { drink($beer);fuck($girl); }else die();
Мониторинг sa:mp серверов


Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги.
Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
LatronДата: Понедельник, 06.02.2012, 14:53 | Сообщение # 3
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
RoACh, ну не такие подробные...


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )


psychoДата: Понедельник, 06.02.2012, 15:00 | Сообщение # 4
16 | 13
Группа: I'm V.I.P.
Сообщений: 327
Награды: 11
Репутация: 645
Замечания: 20%
Статус:
Неплохо,поставлю "Спасибо" за старания. :) :)
BorogДата: Понедельник, 06.02.2012, 15:21 | Сообщение # 5
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Что за разряды из "побитых операторов"? Поясни пжлс


Silver Break
http://s-break.ru/
http://vk.com/sbreak
LatronДата: Понедельник, 06.02.2012, 15:29 | Сообщение # 6
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Borog, Побитовые операторы работают с двоичным представлением позиционной системы счисления.


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Сообщение отредактировал Latron - Понедельник, 06.02.2012, 15:36
BorogДата: Понедельник, 06.02.2012, 15:43 | Сообщение # 7
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Latron, А как это отвечает на мой вопрос? :)


Silver Break
http://s-break.ru/
http://vk.com/sbreak
ZiGGiДата: Понедельник, 06.02.2012, 17:48 | Сообщение # 8
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Borog)
Что за разряды из "побитых операторов"? Поясни пжлс

разряд == бит



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
LatronДата: Понедельник, 06.02.2012, 18:05 | Сообщение # 9
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Borog, ну зигги то ты точно должен понять )понял ведь?


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )


BorogДата: Понедельник, 06.02.2012, 23:09 | Сообщение # 10
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Спасибо, ZiGGi
Но вот как это на практике поможет - для меня загадка :)



Silver Break
http://s-break.ru/
http://vk.com/sbreak
ZiGGiДата: Понедельник, 06.02.2012, 23:32 | Сообщение # 11
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Borog)
Но вот как это на практике поможет - для меня загадка

Т.к. эта статья не очень, я написал свою, вот вырезка из неё:

Где это может реально пригодиться?

Это может пригодиться для существенной экономии памяти. Например вам доступен 1 байт памяти и вам надо записать 2 числа в пределах 0..15. То вы с лёгкостью можете записать их в 1 байт.

Code
new x[1 char]; // создаём массив с 1 ячейкой размерностью в 1 байт
// запишем число 13 в правые 4 бита и цифру 6 в левые 4 бита
// 13 = 1101 (bin)
// 6 = 110 (bin)
x[0] = ((6 << 4)|(13)); // сдвигаем 3 бита цифры 6 в левую часть байта и ставим 4 бита числа 13 в правые 4 бита
// здесь рекомендуется сделать защиту "от дурака", который может
// попытаться записать в правую часть число размером более 4 битов
// делается это так: x = ((6 << 4)|(13 & 15));
// т.к. 15 == 1111 (bin), то мы обнуляем все биты, за этими пределами

После выполнения, x будет равняться 1101101 (bin).
Записали, теперь надо извлечь:
Code
printf("6 = %d",x[0] >> 4); // смещаем вправо на 4 бита, т.к. число 6 у нас в левой части байта
printf("13 = %d",x[0] & 15); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
RockmanДата: Понедельник, 06.02.2012, 23:44 | Сообщение # 12
Постоялец
Группа: Продвинутые
Сообщений: 428
Награды: 4
Город: Нижний Новгород
Репутация: 474
Замечания: 0%
Статус:
Единственные применения, которые я находил битовым операциям, это быстрая выборка по каким либо наборам.
Была такая задача однажды, проверять положение элемента в ячейке, так вот двоичные наборы типа:
0000
0001
0010
0100
1000


Помогали быстро проверять необходимые условия. А так же использовал битовый сдвиг влево, что бы ускорить умножение на 2 и вправо, что бы ускорить деление на 2, но это только задания были, не думаю, что на практике очень часто требуется использовать именно их, тем более в pawn. Хотя битовые операции очень часто используются в криптографии, ну то есть в шифровании.

Добавлено (06.02.2012, 23:44)
---------------------------------------------
Ах да, насчет экономии памяти, лучше сэкономить время и строки кода, чем таким образом экономить эти биты, тем более на нынешних то машинах.

ZiGGiДата: Понедельник, 06.02.2012, 23:51 | Сообщение # 13
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Rockman)
Ах да, насчет экономии памяти, лучше сэкономить время и строки кода, чем таким образом экономить эти биты, тем более на нынешних то машинах.

Вот поэтому когда с каждым днём увеличивается память, мы не замечаем её увеличения:).



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
RockmanДата: Вторник, 07.02.2012, 00:40 | Сообщение # 14
Постоялец
Группа: Продвинутые
Сообщений: 428
Награды: 4
Город: Нижний Новгород
Репутация: 474
Замечания: 0%
Статус:
Quote (ZiGGi)
Вот поэтому когда с каждым днём увеличивается память, мы не замечаем её увеличения:).


Речь идет об оперативной памяти. Скажем, у вас на сервере 2048 мб ОЗУ, она не увеличивается с каждым днем, то время, которое будешь тратить на экономию памяти таким образом, разумнее потратить на оптимизацию кода. Динамически выделять память под массивы, использовать подобие кэша и т.д Уменьшение расхода ОЗУ будет заметнее.

LatronДата: Вторник, 07.02.2012, 01:51 | Сообщение # 15
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
ZiGGi, спасибо,я дополнил урок)


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )


  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua