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

Поиск:

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


Новичок



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

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



ALL
Здрасти всем!  smile 
   Наткнулся на задачу с множествами, где необходимо использовать побитовые операциии. До этого с данной темой не сталкивался. Подскажите, pls, где можно найти исчерпывающую информацию, а то в google ничего путёвого не нашёл. Мне не понятны некоторые моменты; вот, на пример:
 
Код

 ...z>>1 & 0x00000080)<<8;
 

или
  
Код

  ....(z>>1) & 0xffff7fff ) )&0x0000ff00); 
  

Что такое 0x00000080, 0xffff7fff, 0x0000ff00 ? Операции ">>" и "<<" и др. лог. операции мне чуток ясны, а вот какую роль играют, если я не ошибаюсь, маски(так их называют вроде) я нигде не нашёл. Как задаются или они явл. константными выражениями. Объясните, плз!  smile Или можно примеры простенькие, если не трудно.
PM MAIL   Вверх
MAKCim
Дата 1.10.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Цитата

а вот какую роль играют, если я не ошибаюсь, маски(так их называют вроде) я нигде не нашёл. Как задаются или они явл. константными выражениями. Объясните, плз!  

Ну допустим есть число 10001001 01110100 (типа short)
Код

...
short i = 37236;
...

Чтобы проверить установлен ли 3 бит (нумерация с нуля)
используем логическое умножение на маску 00000000 00001000 или
Код

...
short j  = 1<<3;
if (i & j);  // бит установлен
else; // нет

Это совйство связано с таблицей истинности для лог. умножения, т. е
0 & 0 = 0
0 & 1 = 1 & 0 = 0
1 & 1 = 1
т. е
10001001 01110100
&
00000000 00001000
=
00000000 00000000 = 0


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 1.10.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 63
Всего: 196



Базовые понятия Си:

0x... - означает, что число в шестнадцатиричной системе. Например, 0x10 (это 16 в десятичной)
0... - означает, что число в восьмиричной системе. Например, 017 (это 15 в десятичной)

Маской называют число, которое позволяет выделить некую часть из другого. Маски логично задавать в двоичной системе. Но Си это не позволяет, поэтому используют 16-ти ричную систему.
Пример. Есть строка, состоящая из цифр 0, 1... 9. Хотелось бы превратить это в массив чисел от 0, до 9. В ASCII символы '0'...'9' задаются кодами 0x30...0x39. Поэтому, если применить маску 0x0F, то она уберет ненужную информацию и из 0x39 получится 0x09. Это выглядит так: 0x39 & 0x0F = 0x09. Здесь - & - подитовая операция AND. Есть еще | - OR, и ^ - XOR.

>> и << - это операции побитового сдвига вправо и влево соответственно. Сдвиг влево на n разрядов эквивалентен умножению на 2 в степени n, а сдвиг вправо - делению. Данные операции применяются только к целым типам.

Это сообщение отредактировал(а) bsa - 1.10.2006, 17:48
PM   Вверх
student0511
Дата 1.10.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А маски составляются в процессе создания программы, или они являются постоянными и применяются в определённых ситуациях? И, если первое, то  можно более подробнее объяснить о их свойствах (если так можно выразиться  smile  ). Какие классические задачи существуют с применением побитовых операций?


Это сообщение отредактировал(а) student0511 - 1.10.2006, 18:17
PM MAIL   Вверх
MAKCim
Дата 1.10.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Цитата

Какие классические задачи существуют с применением побитовых операций?

Например обнуление переменной
Код

xor AX, AX

Инвертирование бит в числе
Код

x^=~0;

Установка n-го бита
Код

x|=(1<<n);

Сбрасывание n-го бита
Код

x&=(((~0)<<n) | ((~((~0)<<n))>>1));




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
likehood
Дата 1.10.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(MAKCim @  1.10.2006,  20:54 Найти цитируемый пост)
Сбрасывание n-го бита

код C++    
1:    
x&=(((~0)<<n) | ((~((~0)<<n))>>1));


а разве так нельзя:
Код

x &= ~(1<<n);

PM MAIL   Вверх
student0511
Дата 2.10.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что же на счёт масок? В каких случаях их применять?  smile 
PM MAIL   Вверх
Romikgy
Дата 2.10.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(student0511 @  2.10.2006,  00:28 Найти цитируемый пост)
А что же на счёт масок? В каких случаях их применять? 

когда надо ! зависит от задач


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
kondr
Дата 2.10.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Какие классические задачи существуют с применением побитовых операций?


Код

int a = 1;
int b = 2;
                
a^=b;
b^=a;
a^=b;


Вот классический пример. Содержимое переменных меняем местами без использования промежуточной переменной.
PM MAIL   Вверх
smalcom
Дата 2.10.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



при морщинах


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
MAKCim
Дата 2.10.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Цитата

а разве так нельзя:

можно  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
student0511
Дата 2.10.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А не подскажите всё-таки ссылочку на данную тему. И про маски можно по-подробнее раскрыть тему  smile  . 
PM MAIL   Вверх
smalcom
Дата 2.10.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



маски это как язык програмирования - млм ты знаешь куда их приткнуть или оно тебе не надо. Придет время возникнет задача и ты поймешь зачем нужны маски. На пальцах тебе не объяснишь и понятно что гугл те ниче не выдал - маски это не раздел програмирования это инструмент это как знание языка и владение им этому нельзя научить. Засим откланиваюся


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
student0511
Дата 3.10.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня сейчас возникла задача! И я хочу сам допереть до её решения, но т.к., ничего не ведая на данную тему, я  не знаю с чего начать. Тем более по побитовым операциям мало инфы.

Это сообщение отредактировал(а) student0511 - 3.10.2006, 00:02
PM MAIL   Вверх
smalcom
Дата 3.10.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну вот тебе примерчик

Код

unsigned char lpin = ...;//получаем в переменную допустим тошо на ножках LPT порта

if(lpin & 0x01) ...;//если 0-я ножка не ноль
if(lpin & 0x02) ...;//если 1-я ножка не ноль
...
if(lpin & 0x80) ...;//если 7-я ножка не ноль
/*а теперь хочу скинуть в ноль 5-ю ножку и установить в единицу вторую а остальные не
трогать*/
unsigned char temp_lpin = lpin;
temp_lpin &= 0xDF;//1101 1111 - сбрасываем пятую
temp_lpin |= 0x04;//0000 0100 - ставим вторую


вот и все. теперь думай для чего ты его применишь. как грица покажи мне свой порт и я расскажу какой ты бит


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
student0511
Дата 3.10.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 мне свой порт и я расскажу какой ты бит 

Гы-гы. Сильно cказано  smile 
 Можно любое число брать, я про 0xDF, чтобы только получался необходимый результат, т.е. в данном случае: на пятой позиции в 2-ой системе стоял 0-ой бит. Ясно.

Это сообщение отредактировал(а) student0511 - 3.10.2006, 19:25
PM MAIL   Вверх
student0511
Дата 3.10.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А если у меня положение, на которое нужно поставить 1, меняется и зависит от чего-либо. Ну, на пример, у меня есть слово. Как мне поставить единицы на те номера, которые соответствуют номеру буквы в алфавите?  smile 
Вроде допёр: просто взять переменную long из одной 1 единичке и нулей. Потом сдвигать 1 на то место, которое соответствует номеру буквы и применять операцию "ИЛИ". А изначатльные переменные взять за нули.  Можно же так?

Это сообщение отредактировал(а) student0511 - 3.10.2006, 20:23
PM MAIL   Вверх
MAKCim
Дата 3.10.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



student0511
Если брать глобально маски в UNIX очень часто используются
(и в API, и в ядре), потому как они позволяют (точнее не они, а с помощью их) очень эффективно передавать флаги для указания включения чего-нибудь куда-нибудь. Сам подумай, unsigned long для большинства 32-х разрядных платформ способен хранить 64 разных флага! А с помощью масок можно легко проверять установку определенного бита, а вместе с тем флага


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
student0511
Дата 3.10.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Т.е. 64 - это 8 байт чтоль? Значит весь алфавит можно забить, даже останется  smile 

Это сообщение отредактировал(а) student0511 - 3.10.2006, 22:21
PM MAIL   Вверх
Earnest
Дата 4.10.2006, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 53
Всего: 183



Цитата(MAKCim @  3.10.2006,  22:16 Найти цитируемый пост)
 unsigned long для большинства 32-х разрядных платформ способен хранить 64 разных флага!

Все-таки 32. ULONG  на 32-разрядной платформе обычно 4 байта.



--------------------
...
PM   Вверх
MAKCim
Дата 4.10.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Цитата

Все-таки 32. ULONG  на 32-разрядной платформе обычно 4 байта.

ну да, спасибо за поправку


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
student0511
Дата 8.10.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



    Всё. Разобрался. Даже что-то написал  smile  . Спасибо за объяснения!   smile 
    А вообще задача стояла следующим образом: продемонстрировать, используя "машинное слово", работу со множествами.   
Кому интересно:

Это сообщение отредактировал(а) student0511 - 8.10.2006, 01:08

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  machine_word.rar 1,12 Kb
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.1279 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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