~
Формат вызова:
(~ <parameter0>)
тип возвращаемого значения определяется типом первого параметра;
первый параметр в базовой реализации может быть типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустим любой операнд, массив не допустим;
назначение операции: возвращает значение параметра с инвертированными состояниями всех разрядов, например:
a = (~ b);
|
Форматы вызова:
(<parameter0> | <parameter1>)
(| <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2;
первый параметр в базовой реализации может быть типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустим любой операнд, массив не допустим;
второй параметр такого же типа, как первый, допустимы любые операнды, массивы не допустимы;
назначение операции: возвращает значение поразрядного ИЛИ между операндами. Пример использования:
a = (b | 2)
присвоит a значение b с установленным в 1 вторым битом.
&
Форматы вызова:
(<parameter0> & <parameter1>)
(& <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров от 2 до максимального;
первый параметр в базовой реализации может быть типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустим любой операнд, массив не допустим;
второй параметр такого же типа, как первый, допустимы любые операнды, массивы не допустимы;
назначение операции: возвращает значение поразрядного И между операндами, пример использования:
a = (b & 2)
присвоит a значение b со сброшенными в 0 всеми битами, кроме второго, его значение не изменится.
&~
Форматы вызова:
(<parameter0> &~ <parameter1>)
(&~ <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров от 2 до максимального;
первый параметр в базовой реализации может быть типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустим любой операнд, массив не допустим;
второй параметр такого же типа, как первый, допустимы любые операнды, массивы не допустимы;
назначение операции: возвращает значение поразрядного И между первым операндом и инвертированным вторым, используется для сброса битов по маске, пример использования:
a = ( b &~ 2 )
присвоит a значение b со сброшенным вторым битом, эквивалентно недопустимому выражению a = ( b & (~ 2)), поскольку позволяет использовать константу – простая инверсия допустима только над целыми числами, а константа первым параметром у ~ определяется, как вещественное число.
|= =|
Форматы вызова:
<parameter0> |= <parameter1>;
<parameter0> =| <parameter1>;
(<parameter0> |= <parameter1>)
(<parameter0> =| <parameter1>)
|= <parameter0> <parameter1>;
=| <parameter0> <parameter1>;
(|= <parameter0> <parameter1>)
(=| <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2, возвращаемое значение можно игнорировать;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустима только переменная, массив не допустим;
второй параметр такого же типа, как первый, допустим любой операнд, массив не допустим;
назначение операции: выполняет поразрядное ИЛИ операндов, записывает результат в первый операнд и может вернуть его значение, применяется для установки отдельных разрядов в переменной (1 в тех разрядах, которые надо установить), допустима инфиксная запись, оба вида записи выполняются одинаково. Примеры:
a |= 12;
эквивалентно a = (a | 12)
a = (b =| c);
эквивалентно
b = (b | c);
a = b
&= =&
Форматы вызова:
<parameter0> &= <parameter1>;
<parameter0> =& <parameter1>;
(<parameter0> &= <parameter1>)
(<parameter0> =& <parameter1>)
&= <parameter0> <parameter1>;
=& <parameter0> <parameter1>;
(&= <parameter0> <parameter1>)
(=& <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2, возвращаемое значение можно игнорировать;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустима только переменная, массив не допустим;
второй параметр такого же типа, как первый, допустим любой операнд, массив не допустим;
назначение операции: выполняет поразрядное И операндов, записывает результат в первый операнд и может вернуть его значение, применяется для сброса отдельных разрядов в переменной при помощи инверсной маски (с 0 в тех разрядах, которые надо сбросить), допустима инфиксная запись, оба вида записи выполняются одинаково. Примеры:
a &= 12;
эквивалентно a = (a & 12)
a = (b =& c);
эквивалентно
b = (b & c);
a = b
=&~
Форматы вызова:
<parameter0> =&~ <parameter1>;
(<parameter0> =&~ <parameter1>)
=&~ <parameter0> <parameter1>;
(=&~ <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2, возвращаемое значение можно игнорировать;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустима только переменная, массив не допустим;
второй параметр такого же типа, как первый, допустим любой операнд, массив не допустим;
назначение операции: выполняет поразрядное И первого операнда и инверсного второго, записывает результат в первый параметр и может вернуть его значение, применяется для сброса отдельных разрядов в переменной (первый параметр) по маске (второй параметр), маска должна быть в прямой форме (1 в тех разрядах, которые надо сбросить), допустима инфиксная запись, оба вида записи выполняются одинаково. Примеры:
a =&~ 12;
эквивалентно a = (a & (~ 12)), но позволяет использовать константу, поскольку у операции ~ числовая константа определяется, как вещественное число.
a = (b =&~ c);
эквивалентно
b = (b & (~c));
a = b
<<
Форматы вызова:
(<parameter0> << <parameter1>)
(<< <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустимы любые операнды, массив не допустим;
второй параметр типа uint, допустимы любые операнды, массив не допустим;
назначение операции: выполняет сдвиг значения первого параметра влево на число разрядов, заданное вторым параметром, выполняется аналогично одноименной функции языка C (младшие разряды заполняются 0-ми, старшие пропадают), возвращает значение после сдвига, допустима инфиксная запись, например:
a = ((b | 3) << 4)
выполнит установку в значении b (но не в переменной b!) двух младших битов и сдвинет все значение влево на 4 разряда, что эквивалентно умножению на 16.
>>
Форматы вызова:
(<parameter0> >> <parameter1>)
(>> <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустимы любые операнды, массив не допустим;
второй параметр типа uint, допустимы любые операнды, массив не допустим;
назначение операции: выполняет сдвиг значения первого параметра вправо на число разрядов, заданное вторым параметром, выполняется аналогично одноименной функции языка C (старшие разряды заполняются 0-ми, младшие пропадают), возвращает значение после сдвига, допустима инфиксная запись, например:
a = ((b | 64) >> 3)
выполнит установку в значении b (но не в переменной b!) 7-го бита и сдвинет все значение вправо на 3 разряда, что эквивалентно делению на 8.
<<= =<<
Форматы вызова:
<parameter0> <<= <parameter1>;
<parameter0> =<< <parameter1>;
(<parameter0> <<= <parameter1>)
(<parameter0> =<< <parameter1>)
<<= <parameter0> <parameter1>;
=<< <parameter0> <parameter1>;
(<<= <parameter0> <parameter1>)
(=<< <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2, возвращаемое значение можно игнорировать;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустима только переменная, массив не допустим; второй параметр типа uint, допустимы любые операнды, массив не допустим;
назначение операции: выполняет сдвиг значения первого параметра влево на число разрядов, заданное вторым параметром, после чего значение записывается обратно в первый операнд, выполняется аналогично одноименной функции языка C, возвращает значение после сдвига, оба варианта записи одинаковы, допустима инфиксная запись. Примеры:
b <<= 3;
выполнит присвоение переменной b значения этой переменной, сдвинутого влево на 3 разряда (эквивалентно b *= 8).
a = (b <<= 3)
выполнит присвоение переменной b значения этой переменной, сдвинутого влево на 3 разряда и присвоит результат переменной a.
>>= =>>
Форматы вызова:
<parameter0> >>= <parameter1>;
<parameter0> =>> <parameter1>;
(<parameter0> >>= <parameter1>)
(<parameter0> =>> <parameter1>)
>>= <parameter0> <parameter1>;
=>> <parameter0> <parameter1>;
(>>= <parameter0> <parameter1>)
(=>> <parameter0> <parameter1>)
тип возвращаемого значения определяется типом первого параметра, число параметров 2, возвращаемое значение можно игнорировать;
первый параметр типа int или uint (данные другого типа вызывают ошибку при выполнении программы), допустима только переменная, массив не допустим;
второй параметр типа uint, допустимы любые операнды, массив не допустим;
назначение операции: выполняет сдвиг значения первого параметра вправо на число разрядов, заданное вторым параметром, после чего значение записывается обратно в первый параметр, выполняется аналогично одноименной функции языка C, возвращает значение после сдвига, оба варианта записи одинаковы, допустима инфиксная запись. Примеры:
b >>= 3; `эквивалентно` b = (b >> 3);
выполнит присвоение переменной b значения этой переменной, сдвинутого вправо на 3 разряда (эквивалентно b /= 8).
a = (b >>= 3)
выполнит присвоение переменной b значения этой переменной, сдвинутого вправо на 3 разряда, и присвоит результат переменной a.
Операции поразрядного сдвига эквивалентны операциям деления и умножения на такую же степень числа 2, на сколько разрядов сдвигается число, но они более удобны и экономичны, когда в результате вычислений или ввода внешних данных задается число разрядов, на которое необходимо сдвинуть число – в противном случае его придется вычислять возведением 2 в степень, а в языке Ci возведение в степень выполняется только над вещественными числами, что потребует выполнения операций преобразования типа числа от целого к вещественному и обратно, и даже может привести к ошибке в вычислениях.