Поразрядные операторы C: AND, OR, XOR, операции дополнения и сдвига

В этом руководстве вы узнаете обо всех 6 побитовых операторах в программировании на C с примерами.

В арифметико-логическом блоке (который находится внутри ЦП) математические операции, такие как сложение, вычитание, умножение и деление, выполняются на битовом уровне. Для выполнения операций на битовом уровне в программировании на C используются побитовые операторы.

Операторы Значение операторов
& Побитовое И
| Побитовое ИЛИ
^ Побитовое исключающее ИЛИ
~ Побитовое дополнение
<< Сдвиг влево
>> Сдвиг вправо

Побитовый оператор И &

Результат побитового И равен 1, если соответствующие биты двух операндов равны 1. Если любой бит операнда равен 0, результат соответствующего бита оценивается как 0.

Предположим, что для двух целых чисел 12 и 25 выполняется поразрядное И.

 12 = 00001100 (двоичный) 25 = 00011001 (двоичный) Операция с битами 12 и 25 00001100 и 00011001 ________ 00001000 = 8 (десятичный)

Пример # 1: Побитовое И

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a&b); return 0; ) 

Вывод

 Выход = 8

Побитовый оператор ИЛИ |

Результат поразрядного ИЛИ равен 1, если хотя бы один соответствующий бит из двух операндов равен 1. В программировании на C побитовое ИЛИ обозначается символом |.

12 = 00001100 (двоичный) 25 = 00011001 (двоичный) Побитовая операция ИЛИ для 12 и 25 00001100 | 00011001 ________ 00011101 = 29 (в десятичной системе)

Пример # 2: Побитовое ИЛИ

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a|b); return 0; ) 

Вывод

 Выход = 29

Оператор побитового XOR (исключающее ИЛИ) ^

Результат побитового оператора XOR равен 1, если соответствующие биты двух операндов противоположны. Обозначается он ^.

 12 = 00001100 (двоичный) 25 = 00011001 (двоичный) Побитовое исключающее ИЛИ 12 и 25 00001100 00011001 ________ 00010101 = 21 (десятичное)

Пример # 3: Побитовое исключающее ИЛИ

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a^b); return 0; )

Вывод

 Выход = 21

Оператор побитового дополнения ~

Оператор побитового дополнения - это унарный оператор (работает только с одним операндом). Он меняет 1 на 0 и 0 на 1. Обозначается ~.

 35 = 00100011 (двоичный) Побитовое дополнение 35 ~ 00100011 ________ 11011100 = 220 (десятичное) 

Поворот оператора побитового дополнения в программировании на C

Побитовое дополнение до 35 (~ 35) равно -36 вместо 220, но почему?

Для любого целого числа n побитовое дополнение n будет -(n+1). Чтобы понять это, вы должны знать дополнение до 2.

Дополнение 2

Дополнение до двух - это операция с двоичными числами. Дополнение числа до 2 равно дополнению этого числа плюс 1. Например:

 Десятичное двоичное дополнение 2 0 00000000 - (11111111 + 1) = -00000000 = -0 (десятичное) 1 00000001 - (11111110 + 1) = -11111111 = -256 (десятичное) 12 00001100 - (11110011 + 1) = -11110100 = -244 (десятичный) 220 11011100 - (00100011 + 1) = -00100100 = -36 (десятичный) Примечание: переполнение игнорируется при вычислении дополнения до 2. 

Поразрядное дополнение до 35 равно 220 (в десятичной системе). Дополнение 2 до 220 равно -36. Следовательно, на выходе будет -36 вместо 220.

Побитовое дополнение любого числа N равно - (N + 1). Вот как:

 побитовое дополнение N = ~ N (представлено в форме дополнения до 2) 2'дополнение ~ N = - (~ (~ N) +1) = - (N + 1) 

Пример # 4: Побитовое дополнение

 #include int main() ( printf("Output = %d",~35); printf("Output = %d",~-12); return 0; ) 

Вывод

 Выход = -36 Выход = 11

Операторы сдвига в программировании на C

There are two shift operators in C programming:

  • Right shift operator
  • Left shift operator.

Right Shift Operator

Right shift operator shifts all bits towards right by certain number of specified bits. It is denoted by>>.

 212 = 11010100 (In binary) 212>>2 = 00110101 (In binary) (Right shift by two bits) 212>>7 = 00000001 (In binary) 212>>8 = 00000000 212>>0 = 11010100 (No Shift) 

Left Shift Operator

Left shift operator shifts all bits towards left by a certain number of specified bits. The bit positions that have been vacated by the left shift operator are filled with 0. The symbol of the left shift operator is <<.

 212 = 11010100 (In binary) 212<<1 = 110101000 (In binary) (Left shift by one bit) 212<<0 = 11010100 (Shift by 0) 212<<4 = 110101000000 (In binary) =3392(In decimal)

Example #5: Shift Operators

 #include int main() ( int num=212, i; for (i=0; i>i); printf(""); for (i=0; i<=2; ++i) printf("Left shift by %d: %d", i, num< 
 Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848 

Интересные статьи...