Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > побитовые операторы


Автор: ezdef!ghter 21.8.2005, 17:28
Че за побитовые операторы &, |, ^, >>, <<, ~. Зачем они нужны и как ими пользоваться?

Автор: BreakPointMAN 21.8.2005, 18:10
...и да помогут тебе http://www.google.ru и http://www.ya.ru ...

Автор: NwinIX 21.8.2005, 18:43
Тут глянь
http://www.sanych99.narod.ru/New_Site/books/kr/032.html
Пример из книги Кернигана и Ритчи, довольно неплох, да и сам по этой книге С изучал.

Автор: __Sergey__ 21.8.2005, 18:44
Цитата(BreakPointMAN @ 21.8.2005, 18:10)
...и да помогут тебе Google и Яndex ...

вместе с Г. Шилдтом, Х.М. Дейлом и многими другими smile

Автор: Mayk 21.8.2005, 19:09
Цитата(ezdef @ 21.8.2005, 21:28)
&, |, ^, >>, <<, ~.


& - операция И. Если в левом операнде И в правом были установлены биты на позиции n, то в результатируещем значении данный бит будет равен 1. Иначе 0.
Пример: 11110000 & 10101010 (0xf0 & 0xaa) = 10100000(0xa0)

| - операция ИЛИ. Результатирующий бит будет равен 1, если хотя бы один из исходных битов был равен единицы.
Пример: 11110000 | 10101010 (0xf0 | 0xaa) = 11111010(0xfa)

^ - операция исключающего или. Результатирующий бит будет равен 1 только в том случае, когда лишь 1 из исходных битов равен 1.
Пример: 11110000 ^ 10101010 (0xf0 ^ 0xaa) = 01011010(0x5a).

>> - поразрдяный сдвиг вправо на указанное кол-во бит c сохранением знакового бита. Все биты, кроме знакового, сдвигаются вправо(в сторону меньших битов), на освободившееся место встает знаковый бит. Операция аналогична делению на два в степени n, n - правый операнд(кол-во сдвигаемых битов).

Пример: 11110000(0xf0,-16) >> 00000001 (0x01, 1) = 11111000 (0xf8, -8)
Пример: 11110000(0xf0,-16) >> 10101010 (0xaa) = 11111111(0xff, -1).

<< - поразрядый сдвиг влево. Все биты смещаются влево на указанное кол-во бит.Младший бит сбрасывается в ноль. Операция аналогична умножению на два в степени n, n - правый операнд(кол-во сдвигаемых битов).
Пример: 01111111(0x7f, 127) << 00000001 (0x01, 1) = 11111110(0x80, -2)
Пример: 00000001(0x01, 1) << 00000003 (0x01, 1) = 00001000(0x08, 8)

~ - отрицание. Результатирующий бит будет равен 1, если исходный был равен 0. И 0 в ином случау.
Пример: ~10110111(0xb7) = 01001000(0x48).

Автор: comcon1 22.8.2005, 11:50
Стоит добавить, что имеют несравненно высокий (самый высокий приоритет среди операторов). Наравне с operator (*), operator ->, operator . ...

Автор: ezdef!ghter 22.8.2005, 16:11
А какой от них(побитовых операторов) прок? Че с помощью них полезного зделать можна?

Автор: Mayk 22.8.2005, 17:43
Цитата(ezdef @ 22.8.2005, 20:11)
Че с помощью них полезного зделать можна?

1) Быстрое умножение и деление на 2(умножение и особенно деление вообще долгие операции).
2) Флаги объекта. Рассмотрим объект "кот". В каких неисключающих состояниях может быть кот?
Кот может быть - хорошим, а может и не быть
Кот может быть - сытым, а может и не быть.
Кот может быть - счастливым, а может и не быть.
Кот может держать рот сжатым, а может не держать.
Кот может быть - в сапогах, а может и не быть.
Кот можтет быть - со шпагой в лапе, а может и не быть.
В конце концов кот может быть - Доместиком, а может и не быть smile


Определяем флаги:
Код

typedef int CatFlags;
enum {
   CatGood = (1<<1),      //0 бит
   CatSatisfied = (1<<2), //1 бит
   CatHappy = (1 << 3), //2 бит
   CatQuiet = (1<<4), //3 бит
   CatInBoot = (1<<5), //4 бит
   CatWithSword = (1<<6), //5 бит
   СatDomestic = (1 << 7) //6 бит
};


Теперь если мы можем манипулировать состоянием кота очень быстро.
Вот так мы сделаем любого кота счастливым и сытым
Код

catFlags |= CatSatisfied | CatHappy;

Всё же это гораздо короче, чем
Код

catFlags.satisfied = catFlags.happy = true;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)