Skip to main content

Что такое побитовые операторы?

В компьютерной программе побитовые операторы - это операторы для работы с битовыми шаблонами в выражениях. Побитовое И, ИЛИ, исключающее ИЛИ (XOR), НЕ, сдвиг вправо и сдвиг влево являются общими операциями. Большинство языков программирования включают все шесть из этих операторов. Они часто используются для установки, очистки или переключения отдельных битов в программах, управляющих компьютерным оборудованием. Побитовые операторы также часто используются в алгоритмах шифрования и сжатия данных.

Общие побитовые операторы обычно символически представлены в языках программирования, таких как C, C ++ и Java. Они используются в выражениях так же, как и арифметические операторы, такие как знаки плюс или минус. Битовый оператор AND представлен с амперсандом, а OR с каналом | и XOR с кареткой ^ . NOT, также известный как оператор дополнения, обозначается тильдой ~ .

Оператор сдвига вправо использует двойную каретку, указывающую вправо >> . Напротив, сдвиг влево обозначен двойной кареткой, указывающей налево << . Java включает в себя еще одну операцию сдвига вправо, показанную с тройной кареткой вправо >>> .

Битовые операторы применяют логические операции к каждой паре битов в своих операндах. НЕ, правый сдвиг и левый сдвиг имеют только один истинный операнд; Второе значение в операциях сдвига - количество бит. Чтобы лучше понять, как работают побитовые операторы, человек может визуализировать свои операнды в виде двоичных чисел. Например, оператор дополнения переворачивает каждый бит своего единственного операнда в противоположное состояние. Единица становится нулем, а ноль становится единицей. Дополнение к 8-битному двоичному значению 00110101 равно 11001010.

Оператор AND имеет два операнда. Побитовая логическая операция И выполняется с использованием одного соответствующего бита от каждого операнда. Результат каждой битовой операции помещается в эту битовую позицию общего результата. Например, оператор AND будет обрабатывать бит 7 одного операнда с битом 7 другого операнда. Результат будет сохранен в бите 7 общего результата.

В операции И оба бита операнда должны быть единицами, чтобы результат был один, в противном случае результат равен нулю. Например, если 8-разрядные двоичные значения операндов равны 00110101 и 11110000, результатом будет 00110000. Обычно оператор AND используется для обнуления конкретных битов в результате. Это делается путем помещения нулей в эти битовые позиции в одном из операндов.

В операции ИЛИ оба бита операнда должны быть равны нулю, чтобы результат был равен нулю; в противном случае результат один. Обычно оператор ИЛИ устанавливает определенные биты результата в единицы. Это делается путем помещения их в эти битовые позиции в одном из операндов. Для операции XOR результат равен нулю, если оба бита операнда равны нулю или если оба бита операнда равны единице, в противном случае результат равен единице.

Сдвиг влево и вправо перемещают биты в операнде влево или вправо на указанное количество битовых позиций. Логический сдвиг вправо перемещает ноль в крайний левый бит как часть сдвига. Арифметическое смещение вправо копирует самый левый бит - знаковый бит - до смещения в ту же позицию после смещения. Оригинальный бит также сдвинут вправо вместе с остальными. Любой тип сдвига влево перемещает ноль в крайний правый бит.

Когда операнд сдвинут вправо, самый правый бит перед сдвигом просто отбрасывается. Аналогично, самый левый бит перед левым сдвигом удаляется. Он не переносится на другой конец операнда.

Битовые операции сдвига зависят от языка и реализации. Например, в C и C ++ >> и << выполняют логические сдвиги, если операндом является целое число без знака. Если операндом является целое число со знаком, скорее всего, вместо него будет выполнено арифметическое смещение. В Java все операнды считаются подписанными, а арифметические сдвиги всегда выполняются с помощью >> и << . Оператор >>> используется для логического сдвига вправо, но все же можно случайно сделать арифметическое сдвиг вправо, без тщательной типизации.

Осложнения могут также возникнуть, когда операнды имеют разную длину в битах или когда некоторые подписаны, а некоторые без знака. Побитовые операторы и числовые константы в середине сложного выражения могут оцениваться не так, как ожидалось. Необходимо позаботиться о том, чтобы указать размер и подпись / без знака характер каждого количества в выражении. Это может быть сделано с помощью тщательного приведения типов или временных назначений для определенных типов переменных в программном коде.