Всем привет,сегодня расскажу вам что такое операторы... Отношения:
== - равно. Пример 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); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)
Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги. Моя 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 мб ОЗУ, она не увеличивается с каждым днем, то время, которое будешь тратить на экономию памяти таким образом, разумнее потратить на оптимизацию кода. Динамически выделять память под массивы, использовать подобие кэша и т.д Уменьшение расхода ОЗУ будет заметнее.