Всем привет,сегодня расскажу вам что такое операторы... Отношения:
== - равно. Пример 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 на единицу.
Оператор & (побитовое И) часто используется для обнуления некоторой группы разрядов. Например
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); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)
Какой это уже по счёту урок по операторам? if(isset($beer)&&isset($girl)) { drink($beer);fuck($girl); }else die(); Мониторинг sa:mp серверов Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги. Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
Но вот как это на практике поможет - для меня загадка
Т.к. эта статья не очень, я написал свою, вот вырезка из неё:
Где это может реально пригодиться?
Это может пригодиться для существенной экономии памяти. Например вам доступен 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); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)
Единственные применения, которые я находил битовым операциям, это быстрая выборка по каким либо наборам. Была такая задача однажды, проверять положение элемента в ячейке, так вот двоичные наборы типа: 0000 0001 0010 0100 1000
Помогали быстро проверять необходимые условия. А так же использовал битовый сдвиг влево, что бы ускорить умножение на 2 и вправо, что бы ускорить деление на 2, но это только задания были, не думаю, что на практике очень часто требуется использовать именно их, тем более в pawn. Хотя битовые операции очень часто используются в криптографии, ну то есть в шифровании.
Добавлено (06.02.2012, 23:44) --------------------------------------------- Ах да, насчет экономии памяти, лучше сэкономить время и строки кода, чем таким образом экономить эти биты, тем более на нынешних то машинах.
Вот поэтому когда с каждым днём увеличивается память, мы не замечаем её увеличения:).
Речь идет об оперативной памяти. Скажем, у вас на сервере 2048 мб ОЗУ, она не увеличивается с каждым днем, то время, которое будешь тратить на экономию памяти таким образом, разумнее потратить на оптимизацию кода. Динамически выделять память под массивы, использовать подобие кэша и т.д Уменьшение расхода ОЗУ будет заметнее.