Учебник по программированию на C для Linux, часть 13 — Битовые операторы (основы)
На этой странице
- Заключение
До сих пор в этой продолжающейся серии руководств по программированию на C мы обсуждали несколько видов операторов, таких как арифметические, логические, реляционные и присваивания. Однако есть еще один тип операторов, которые являются неотъемлемой частью языка программирования Си. Мы говорим о побитовых операторах.
Как вы, возможно, уже знаете, каждая переменная, которую вы используете в своей программе на C, хранится в памяти в виде байтов. Далее эти байты разбиваются на 8 бит каждый. Бит может быть равен 1 или 0. Например, если a — это короткое целое число (занимающее два байта) со значением 1, то на уровне памяти a представляется следующим образом:
00000000 00000001
Точно так же, если b равно 3, то вот как оно представлено в памяти:
00000000 00000011
Примечание. Перейдите сюда, чтобы узнать больше о том, как целые числа представлены в виде битов в памяти.
Побитовые операторы, которые собирались обсудить здесь, работают с этими битами. Начнем с побитового оператора И, который представлен символом &. Он принимает два двоичных представления равной длины и выполняет логическую операцию И над соответствующими битами.
В логической операции И, только когда оба соответствующих бита равны 1, результат равен 1. В противном случае результат равен 0. Итак, если вы сделаете следующее:
a & b
Если a равно 1, а b равно 3 (как описано в начале этого руководства), операция дает следующий результат:
00000000 00000001
Это связано с тем, что при логическом И битовых представлений a и b только крайний правый бит остается равным 1, а все остальные биты становятся равными 0. В целочисленной (точнее, десятичной) форме это битовое представление оказывается равным 1.
Вот код этой операции:
#include <stdio.h>
int main()
{
short a = 1;
short b = 3;
printf("a & b = %i", a&b);
return 0;
}
И вот вывод этого кода:
a & b = 1
Так же, как &, есть и другие побитовые операторы. Вот полный список:
& - AND
| - inclusive OR
^ - exclusive OR
<< - left shift
>> - right shift
~ - one's complement or NOT
Оператор ИЛИ (|) выполняет операцию логического включающего ИЛИ над соответствующими битами своих операндов — если какой-либо из битов равен 1, результирующий бит также равен 1, в противном случае результирующий бит равен 0. Оператор исключающее ИЛИ (или XOR) работает довольно хорошо. очень похож на оператор ИЛИ, только результирующий бит равен 0, если оба бита равны 0 или 1.
Оператор сдвига влево сдвигает биты количество раз, указанное вторым операндом. Например, следующая строка гарантирует, что биты будут смещены влево 3 раза.
a << 3
Если a было коротким целым числом со значением 1, то его битовое представление было примерно таким:
00000000 00000001
Но после операции сдвига влево его битовое представление стало таким:
00000000 00001000
Итак, вы можете видеть, что каждый бит сдвигается 3 раза, перенося бит со значением 1 на четвертую позицию (и заполняя свободные битовые позиции нулями). Итак, теперь десятичное значение a становится равным 8.
В тех же строках оператор сдвига вправо (>>) сдвигает биты вправо. Наконец, оператор дополнения до единицы или НЕ – единственный унарный оператор в этом списке – инвертирует все биты (или выполняет логическое отрицание каждого бита) операнда. Например, если a является однобайтовой переменной и представлена в памяти следующим образом:
11111110
Тогда ~a сделает это:
00000001
Обратите внимание, что побитовые операторы можно применять только к переменным char, short, int и long (как со знаком, так и без знака).
Заключение
Надеюсь, мне удалось разъяснить основную концепцию побитовых операторов. Конечно, есть некоторые сценарии, такие как применение операторов сдвига к значениям со знаком, а также практические примеры побитовых операторов, которые мы здесь не рассмотрели. Но они обязательно будут рассмотрены в следующем уроке.