Поиск по сайту:

Учебник по программированию на C для Linux, часть 13 — Битовые операторы (основы)


На этой странице

  1. Заключение

До сих пор в этой продолжающейся серии руководств по программированию на 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 (как со знаком, так и без знака).

Заключение

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