Название: Побитовые логические операции в С/С++ Отправлено: Артем от Апрель 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) Битовые маски и их область применения. Название: Re: Побитовые логические операции в С/С++ Отправлено: LazarusLong от Апрель 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 Название: Re: Побитовые логические операции в С/С++ Отправлено: Артем от Апрель 05, 2008, 11:31:28 Продолжение:
3) Включение разрядов, отключение, переключение, проверка значения разряда. 4) Операции побитового сдвига и их область применения. Вроде Все! Можно сказать, что вся тема затевалась только из-за области применения побитовых операций, потому что общие сведения нам хорошо дали на лекции. Но я все равно решил включить сюда и их, на всякий случай. ЗЫ: материалы взяты из книги С.Прата "Язык программирвоания С/С++". Название: Re: Побитовые логические операции в С/С++ Отправлено: LazarusLong от Апрель 05, 2008, 03:39:08 Создал статью в вики (http://wiki.kita.org.ua/index.php/%D0%9F%D0%BE%D1%80%D0%B0%D0%B7%D1%80%D1%8F%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8)
Название: Re: Побитовые логические операции в С/С++ Отправлено: Артем от Май 02, 2008, 08:08:40 ЗДЕСЬ (http://club.shelek.ru/viewart.php?id=126) очень подробно и понятно написано про 2-ичное представление данных, дополнительный код и т.д. :
см. Инверсия в С/C++ (http://kita.org.ua/index.php/topic,2909.0.html) |