Русский

Справочник MQL4 Основы языка Операции и выражения Побитовые операции

Побитовые операции

Дополнение до единицы

Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.

b = ~n;

Пример:

   char a='a',b;
   b=~a;
   Print("a = ",a, "  b = ",b);  
// Результат будет такой:
// a= 97   b= -98

Сдвиг вправо

Двоичное представление x сдвигается вправо на y разрядов. Если сдвигаемое значение имеет беззнаковый тип, то осуществляется логический сдвиг вправо, то есть, освобождающиеся слева разряды будут заполняться нулями.

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

x = x >> y;

Пример:

   char a='a',b='b';
   Print("Before:  a = ",a, "  b = ",b); 
//--- произведем сдвиг вправо   
   b=a>>1;
   Print("After:   a = ",a, "  b = ",b); 
// Результат будет такой:
// Before:  a = 97   b = 98
// After:   a = 97   b = 48

Сдвиг влево

Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.

x = x << y;

Пример:

   char a='a',b='b';
   Print("Before:  a = ",a, "  b = ",b); 
//--- произведем сдвиг влево   
   b=a<<1;
   Print("After:   a = ",a, "  b = ",b); 
// Результат будет такой:
// Before:  a = 97   b = 98
// After:   a = 97   b = -62

Не рекомендуется производить сдвиг на большее или равное число битов, чем разрядность сдвигаемой переменной, так как результат такой операции не определен.

При выполнении операции сдвига над 32-х битными типами для вычисления сдвига учитываются только младшие 5 бит, а для операций сдвига над 64-х битными типами значения сдвига определяется только младшими 6 битами. Покажем это на примере:

   int a=305;    // тип int имеет размер 4 байта и является 32-х битными число
   int b=a;      // сделаем копию
   int shift=37; // зададим переменную сдвига
   shift++;      // увеличим значения на 1, shift=38
   //--- задаем сдвиг на 38 разрядов, но на самом деле будет произведен сдвиг на 6 разрядов
   a=a>>shift;   // 38 в двоичном представлении будет выглядеть как '100110', младшие 5 бит '00110' представляют число 6 
   b=b>>6;       // над переменной b произведен сдвиг на 6 разрядов
   //--- убедимся, что переменные a и b содержат одинаковое значение после операции сдвига
   Print("a = ", a, "    b = ", b);

Побитовая операция И

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.

b = ((x & y) != 0);

Пример:

   char a='a',b='b';
//--- операция И
   char c=a&b;
   Print("a = ",a,"  b = ",b);
   Print("a & b = ",c);
// Результат будет такой:
// a = 97   b = 98
// a & b = 96

Побитовая операция ИЛИ

Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 - во всех остальных разрядах.

b = x | y;

Пример:

   char a='a',b='b';
//--- операция ИЛИ
   char c=a|b;
   Print("a = ",a,"  b = ",b);
   Print("a | b = ",c);
// Результат будет такой:
// a = 97   b = 98
// a | b = 99

Побитовая операция исключающее ИЛИ

Побитовая операция исключающее ИЛИ (eXclusive OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.

b = x ^ y;

Пример:

   char a='a', b='b';
//--- операция исключающее ИЛИ
   char c=a^b;
   Print("a = ",a,"  b = ",b);
   Print("a ^ b = ",c);
// Результат будет такой:
// a = 97   b = 98
// a ^ b = 3

Побитовые операции выполняются только с целыми числами.

Смотри также

Приоритеты и порядок операций