Перевести страницу

Создание приложений для науки и производства ещё не было таким простым

Поразрядниые операции над целыми числами

~

Формат вызова:

    (~ <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 возведение в степень выполняется только над вещественными числами, что потребует выполнения операций преобразования типа числа от целого к вещественному и обратно, и даже может привести к ошибке в вычислениях.