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

Поиск:

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


Шустрый
*


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

Репутация: нет
Всего: 1



Привет всем!
Как посчитать "побитое или" двух целых чисел?...
Каков результат этой оперции?
Заранее благодарен smile
--------------------
Трудись, и будешь счастлив ты!
PM MAIL ICQ   Вверх
bel_nikita
Дата 7.12.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Переведи в двоичную, а дальше:
1 | 1 = 1
1 | 0 = 1
0 | 0 = 0


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
nikitao
Дата 7.12.2005, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Вот так и будет:
Код

int x,y,z;
x=17;
y=20;
z=x|y;//побитовое или x и y


Это сообщение отредактировал(а) nikitao - 7.12.2005, 23:27


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
DESert
Дата 7.12.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



тогда z равно 20 (10100) ? если правильно всё понял...
--------------------
Трудись, и будешь счастлив ты!
PM MAIL ICQ   Вверх
nikitao
Дата 7.12.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



DESert,При компеляции выдало 21.Ты ошибся в последнем бите



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
DESert
Дата 7.12.2005, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



да, устный счет подвёл, машина оказалась сильней smile
--------------------
Трудись, и будешь счастлив ты!
PM MAIL ICQ   Вверх
cardinal
Дата 7.12.2005, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



DESert, не забывай, что проверить это можно в обычном виндовозном калькуляторе...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DESert
Дата 8.12.2005, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



а как можно представить число типа double в двоичное представление?
--------------------
Трудись, и будешь счастлив ты!
PM MAIL ICQ   Вверх
cardinal
Дата 8.12.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Точно также как и все остальные...
http://forum.vingrad.ru/index.php?act=Sear...%EB%E5%ED%E8%FF


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DESert
Дата 8.12.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



спасибо smile
--------------------
Трудись, и будешь счастлив ты!
PM MAIL ICQ   Вверх
Fighter
Дата 12.12.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



А как работать с побитовыми операциями, например, как это широко практикуется в MFC.
Например в каком нибудь *.h файле объявлены константы

Код

#define WS_VISIBLE 0x0001
#define WS_FLAT      0x0002
...


Потом в какой-нибудь функции мы пишем

Код

  CreateWindow(...., WS_VISIBLE | WS_FLAT, ...)


И у нас создается "видимое плоское окошко".
Как самому писать такие фени (ну пусть что-нить попроще будет для начала).
Например, чтобы я написал что-то вроде

Код

  #define PARAM1 0x0001
  #define PARAM2 0x0002

...
  int a;
  a = PARAM1 | PARAM2;


Вроде я правильно все написал (если не правильно то пожалуйста поправльте). И затем мне нужно проверять, установил ли я значения PARAM1 и PARAM2 или нет.
PM MAIL   Вверх
cardinal
Дата 12.12.2005, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата(Fighter @ 11.12.2005, 22:05)
И затем мне нужно проверять, установил ли я значения PARAM1 и PARAM2 или нет.

А если ты их не установишь, то ничего компилироваться не будет...
Цитата(Fighter @ 11.12.2005, 22:05)
например, как это широко практикуется в MFC.

Широко, т.к. то что ты объявляешь с помощью #define это константы, а их название запомнить проще, чем какие-то там цифры.
Цитата(Fighter @ 11.12.2005, 22:05)
Как самому писать такие фени (ну пусть что-нить попроще будет для начала).
Например, чтобы я написал что-то вроде

Ну так правильно ты все написал. В чем проблема то?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
azesmcar
Дата 12.12.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Например для функции
Код

#define PARAM1 0x0001
#define PARAM2 0x0002

int func(int params)
{
   if ( (params & PARAM1) != 0 )
   {
       //флаг PARAM1 задан
   }
   if ( (params & PARAM2) != 0 )
   {
       //флаг PARAM2 задан
   }
}

Работает это так..
ты задаешь вместо своей переменной int params PARAM1 | PARAM2 т.е. получается
00000001 PARAM1
|
00000010 PARAM2
-------------
00000011 params
а в функции уже проверяешь если последний бит установлен в единицу значит PARAM1 задан...примерно так
00000011 params
&
00000001 PARAM1
-------------
00000001 result

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



передаю  PARAM1 проверяю: params & PARAM1 ==1
передаю  PARAM2 проверяю: params & PARAM2 ==2

передаю  PARAM2 проверяю: params & PARAM1 ==0
передаю  PARAM1 проверяю: params & PARAM2 ==0
все верно
передаю  PARAM2 проверяю: params & PARAM3 ==2
передаю  PARAM3 проверяю: params & PARAM2 ==2
что-за? как сделать больше двух параметров

Код

#define PARAM1 0x0001
#define PARAM2 0x0002
#define PARAM3 0x0003 //?




Это сообщение отредактировал(а) apook - 1.10.2007, 08:17


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
dumb
Дата 1.10.2007, 08:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Цитата(apook @  1.10.2007,  09:15 Найти цитируемый пост)
что-за? как сделать больше двух параметров
константы должны быть степенями двойки: 1,2,4,8,...
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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