КИТА unofficial
Ноябрь 22, 2024, 09:53:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Побитовые логические операции в С/С++  (Прочитано 16757 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« : Апрель 05, 2008, 10:54:28 »

В качестве подготовки к модулю по ООП пришлось проштудировать тему поразрядных операций, а именно область их применения (включение, выключение битов и т.п). Порыскал в инете, но нашел только часть того, что было нужно. Еще часть взял из книги. Короче, выкладываю здесь все что нашел и слепил воедино. Думаю это пригодиться 1-курсникам, таким же как и я. А именно ИУС-07, у которых это будет на модуле  )))

Поразрядные логические операции

Четыре логических поразрядных операции работают с целочисленными данными, включая тип char. Название поразрядные связано с тем, что операции выполняются над каждым разрядом независимо от разрядов слева или справа. Не путайте их с обычны¬ми логическими операциями (&&, | | и !), которое управляют значениями в целом.

Дополнение до единицы или поразрядное отрицание: ~

Унарная операция - преобразовывает все единицы в нули и все нули в единицы, как показано в следующем примере:

 ~(10011010) //выражение
   (01100101)   // результат

Предположим, переменной val типа unsigned char присвоено значение 2. В двоичном выражении оно имеет вид 00000010. Тогда выражению ~val будет соответствовать значение 11111101 или 253. Обратите внимание, что операция не изменяет значения переменной val подобно тому, как не изменяет значение val выражение 3*val. Оно по-прежнему равно 2. Вместо этого создается новое значение, которое может быть использовано в другом выражении либо присвоено другой переменной:

newval = ~val;
printf("%d",   ~val);

Чтобы значение val изменить на ~val, можно воспользоваться простым оператором присваивания:

val = ~val;

Поразрядная операция "И": &

Двоичная операция & создает новое значение за счет выполнения поразрядного сравнения двух операндов. Для каждой позиции результирующий разряд будет иметь значение 1 только в случае, когда соответствующие разряды обоих операндов имеют значение 1. (Применительно к логическим значениям можно сказать, что результат будет истинным только в случае, когда оба двоичных операнда имеют истинные зна¬чения.) Таким образом, в результате вычисления выражения:

   (10010011)   
&   
   (00111101)       

получается следующее значение:

   (00010001)      

Такой результат обусловлен тем, что только нулевой и четвертый разряды обоих операндов имеют значение 1. В языке С также существует комбинированная операция "И"-присваивание:
val &= 0377; дает тот же результат, что и следующее выражение: val=val & 0377;

Остальное кидаю фотками, здесь охватываються следующие темы:

1) Поразрядные операциия "ИЛИ |" и исключающее "ИЛИ ^".
2) Битовые маски и их область применения.
« Последнее редактирование: Июль 28, 2008, 07:01:45 от artem90 » Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #1 : Апрель 05, 2008, 11:16:14 »

Работу поразрядных операций легко запомнить с помощью таблиц истинности:

И (конъюнкция) (Х1 и Х2 - операнды, Х3 - результат операции)
X1    X2  |   X3
-----------------
0      0    |   0
0      1    |   0
1      0    |   0
1      1    |   1

То есть для получения единицы в результате оба операнда(И первый, И второй) конъюнкции должны быть равны 1.

ИЛИ (дизъюнкция) (Х1 и Х2 - операнды, Х3 - результат операции)
X1    X2  |   X3
-----------------
0      0    |   0
0      1    |   1
1      0    |   1
1      1    |   1

То есть для получения единицы в результате хотя бы один операнд дизъюнкции (ИЛИ 1-й, ИЛИ 2-й, ИЛИ оба) должны быть равны 1.


исключающее ИЛИ (сложение по модулю 2) (Х1 и Х2 - операнды, Х3 - результат операции)
X1    X2  |   X3
-----------------
0      0    |   0
0      1    |   1
1      0    |   1
1      1    |   0

То есть для получения единицы в результате операнды должны быть равны различны.

Несколько простеньких правил:

а И 1 = а
а И 0 = 0
а И НЕ(а) = 0
а И а = а

а ИЛИ 1 = 1
а ИЛИ 0 = а
а ИЛИ НЕ(а) = 1
а ИЛИ а = а

а XOR 0 = а
а XOR 1 = НЕ(а)
а XOR НЕ(а) = 1
а XOR а = 0
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #2 : Апрель 05, 2008, 11:31:28 »

Продолжение:

3) Включение разрядов, отключение, переключение, проверка значения разряда.
4) Операции побитового сдвига и их область применения.

Вроде Все!  Можно сказать, что вся тема затевалась только из-за области применения побитовых операций, потому что общие сведения нам хорошо дали на лекции. Но я все равно решил включить сюда и их, на всякий случай.

ЗЫ: материалы взяты из книги С.Прата "Язык программирвоания С/С++".
« Последнее редактирование: Июль 28, 2008, 07:12:14 от artem90 » Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #3 : Апрель 05, 2008, 03:39:08 »

Создал статью в вики
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #4 : Май 02, 2008, 08:08:40 »

ЗДЕСЬ очень подробно и понятно написано про 2-ичное представление данных, дополнительный код и т.д. :


см. Инверсия в С/C++

« Последнее редактирование: Июль 28, 2008, 07:15:27 от artem90 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.076 секунд. Запросов: 28.