Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побитовое или, побитовые операции 
:(
    Опции темы
Fazil6
Дата 1.10.2007, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

пить надо меньше, меньше надо пить...



PM MAIL   Вверх
zkv
Дата 1.10.2007, 18:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Fighter @  12.12.2005,  00:05 Найти цитируемый пост)
Как самому писать такие фени (ну пусть что-нить попроще будет для начала).
Например, чтобы я написал что-то вроде
  #define PARAM1 0x0001
  #define PARAM2 0x0002
...
  int a;
  a = PARAM1 | PARAM2;


Как правильно сказал dumb, все дело в волшебных пузырьках - степенях двойки smile
Посмотрим, как записываются числа - степени двойки в двоичной системе:
2^x  |  x(dec)  |  x(bin)  |
-------------------------------
2^0  |   1         |1           |
2^1  |   2         |10         |
2^2  |   4         |100       |
2^3  |   8         |1000     |
2^4  |   16       |10000   |
...

вообщем видна закономерность?  smile
те с помощью числа 2^0 можно манипулировать младшим битом в числе (обычно - самый правый бит), 
2^1 - вторым справа и так далее с помощью логических операций. 

Для установки бита пользуемся оператором | 
Смотрим таблицу:
Цитата(bel_nikita @  7.12.2005,  23:25 Найти цитируемый пост)
1 | 1 = 1
1 | 0 = 1
0 | 0 = 0 

еще надо было добавить строку: 0 | 1 = 1
берем любое число A, и применяем к нему операцию:
A |= 1;
в итоге все биты числа A останутся без изменений, кроме правого, который установится в 1, независимо от того, был установлен в нем бит или нет ранее.
Почему так - понятно по таблице выше.

Для сброса бита используем оператор &
Таблица:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0 
применяем операцию:
A &= 1111..10; - колличество разрядов соответствующее числу A, 
или другими словами:
A &= ~1; 
или 
A ^= 1; 

Для проверки бита:
(A & 1) != 0;

Примерчик:
Код

#include <iostream>

#define PARAM0 1
#define PARAM1 1<<1
#define PARAM2 1<<2
#define PARAM3 1<<3
#define PARAM4 1<<4
#define PARAM5 1<<5

bool IsParam3Set( unsigned nParams )
{
    nParams &= PARAM3;
    return nParams != 0;
}

void DropParam3( unsigned &nParams )
{
    nParams ^= PARAM3;
}

void SetParam3( unsigned &nParams )
{
    nParams |= PARAM3;
}

void PrintParam3State( unsigned nParams )
{
    if( IsParam3Set(nParams) )
        std::cout<<"set";
    else
        std::cout<<"dropped";
}

int main()
{
    unsigned nParams = 0;
    std::cout<<"Parameter 3 is initially ";
    PrintParam3State( nParams );

    SetParam3( nParams );
    std::cout<<"\nParameter 3 after setting is ";
    PrintParam3State( nParams );

    DropParam3( nParams );
    std::cout<<"\nParameter 3 after dropping is ";
    PrintParam3State( nParams );

    std::cout<<"\nPress <Enter> to continue...";
    std::cin.get();
}


Это сообщение отредактировал(а) zkv - 1.10.2007, 18:46
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0844 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.