Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основыпрогр 1курс 2семестр.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
17.84 Mб
Скачать

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.