16. Поразрядные операции для начинающих
Первое и главное, данные операторы работают только с целочисленными значениями, как положительными так и отрицательными, но они не применяются к значениям с плавающей точкой, по крайней мере так гласит стандарт ANSI C. Данные операторы работают не целиком с числом а с каждым битом в каждом разряде, отсюда и название поразрядные. Хотя на самом деле на уровне процессора это все выполняется одновременно со всеми битами, но для лучшего понимания будем считать что оператор берет и работает с разрядами последовательно начиная с младшего и дальше до последнего.
Таким образом оператор берет два своих операнда и начинает работать поочередно с каждым разрядом, беря бит из 1-го разряда левого операнда и бит из 1-го разряда правого операнда и в зависимости от этих битов формирует бит 1-го разряда результата, затем переходит ко 2-му разряду, 3-му и так далее. Ни один из данных операторов не изменяет своих операндов а возвращает результирующие значение, которое можно присвоить переменной. Таким образом если вы сделаете так: var1 & var2 то ни одна из переменных не будет изменена, оператор вернет вам результат с которым вы вольны сделать что душе угодно. Важно: Не путайте данные операторы с логическими операторами такими как && или ||, эти совсем другое.
Существуют 6 основных битовых операторов.
& |
Поразрядное И |
| |
Поразрядное включающие ИЛИ |
^ |
Поразрядное исключающие ИЛИ |
‹‹ |
Сдвиг влево |
›› |
Сдвиг вправо |
~ |
Одноместное поразрядное дополнение до единицы |
Я постараюсь максимально подробно рассказать принцип поведения данных операторов на примере "поразрядного И", остальные операторы будут описаны максимально коротко, так как суть у них одна. Так же максимально подробно рассмотри оператор "сдвига влево" а оператор "сдвига вправо" аналогичен и будет так же описан коротко. И так, приступим, во всех описаниях будут использоваться числа двоичной системе счисления.
Поразрядное и (&)
Данный оператор берет из одинаковых разрядов левого и правого операнда значения и если оба значения 1 то в результате будет 1, во всех остальных случаях будет 0. Его легко запомнить так: Если единица там И единица тут то будет единица. То есть что бы получить единицу нам надо что бы и там И тут была единица.
Предположим что у нас есть два 4-х битовых числа 0101 и 0011 и мы желаем применять к ним операцию "И" 0101 & 0011. Что же будет происходить. Оператор получает два операнда левый это у нас 0101 а правый это 0011 Пока оператор не знает результата и он для него загадка в виде ХХХХ.
|
Разряд 4 |
Разряд 3 |
Разряд 2 |
Разряд 1 |
Левый операнд |
0 |
1 |
0 |
1 |
Правый операнд |
0 |
0 |
1 |
1 |
Результат |
X |
X |
X |
X |
Шаг 1: Оператор обращается к 1-м разрядам своих операндов и получает 1 из левого операнда и 1 из правого операнда, а так как согласно логике работы оператора если имеется 2 единицы то и результат будет единица, то в 1-й разряд результата надо поместить 1. И вот в результате уже появляется первое неизвестно и результат принимаем вид вида : ХХХ1
Шаг 2: Оператор берет биты 2-го разряда из своих операндов и на руках у него 0 и 1, а как мы знаем логика данного оператора гласит что единица только в случае если единица и там и тут, в результат во 2-й разряд пойдет 0. И результат становится уже таким: ХХ01
Шаг 3: Оператор обращается к битам 3-го разряда получая 1 и 0, опять получаем 0 и в 3-й разряд результата идет 0. Результат теперь выглядит так: Х001
Шаг 4: Оператор добирается до последнего 4-горазряда получая 0 и 0 и снова согласно логике в результат в 4-й разряд идет 0. И вот наш конечный результат: 0001
Операция: 0101 & 0011 |
Разряд 4 |
Разряд 3 |
Разряд 2 |
Разряд 1 |
Левый операнд |
0 |
1 |
0 |
1 |
Правый операнд |
0 |
0 |
1 |
1 |
Результат |
0 |
0 |
0 |
1 |
Как видно из таблицы, оператор пройдет по каждому разряду и выполнит проверку если 1 и 1 то 1, во всех остальных случаях будет ноль. И так результатом применения операции 0101 & 0011 будет 0001.
