| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Побитовые операции |
| Автор: student0511 1.10.2006, 17:25 | ||||
| ALL Здрасти всем! Наткнулся на задачу с множествами, где необходимо использовать побитовые операциии. До этого с данной темой не сталкивался. Подскажите, pls, где можно найти исчерпывающую информацию, а то в google ничего путёвого не нашёл. Мне не понятны некоторые моменты; вот, на пример:
или
Что такое 0x00000080, 0xffff7fff, 0x0000ff00 ? Операции ">>" и "<<" и др. лог. операции мне чуток ясны, а вот какую роль играют, если я не ошибаюсь, маски(так их называют вроде) я нигде не нашёл. Как задаются или они явл. константными выражениями. Объясните, плз! |
| Автор: MAKCim 1.10.2006, 17:41 | ||||||
Ну допустим есть число 10001001 01110100 (типа short)
Чтобы проверить установлен ли 3 бит (нумерация с нуля) используем логическое умножение на маску 00000000 00001000 или
Это совйство связано с таблицей истинности для лог. умножения, т. е 0 & 0 = 0 0 & 1 = 1 & 0 = 0 1 & 1 = 1 т. е 10001001 01110100 & 00000000 00001000 = 00000000 00000000 = 0 |
| Автор: bsa 1.10.2006, 17:45 |
| Базовые понятия Си: 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, а сдвиг вправо - делению. Данные операции применяются только к целым типам. |
| Автор: student0511 1.10.2006, 18:15 |
| А маски составляются в процессе создания программы, или они являются постоянными и применяются в определённых ситуациях? И, если первое, то можно более подробнее объяснить о их свойствах (если так можно выразиться |
| Автор: MAKCim 1.10.2006, 19:54 | ||||||||||
Например обнуление переменной
Инвертирование бит в числе
Установка n-го бита
Сбрасывание n-го бита
|
| Автор: likehood 1.10.2006, 22:56 | ||||
а разве так нельзя:
|
| Автор: student0511 2.10.2006, 01:28 |
| А что же на счёт масок? В каких случаях их применять? |
| Автор: Romikgy 2.10.2006, 09:04 |
когда надо ! зависит от задач |
| Автор: kondr 2.10.2006, 09:48 | ||||
Вот классический пример. Содержимое переменных меняем местами без использования промежуточной переменной. |
| Автор: smalcom 2.10.2006, 10:16 |
| при морщинах |
| Автор: MAKCim 2.10.2006, 14:39 | ||
можно |
| Автор: student0511 2.10.2006, 15:57 |
| А не подскажите всё-таки ссылочку на данную тему. И про маски можно по-подробнее раскрыть тему |
| Автор: smalcom 2.10.2006, 20:32 |
| маски это как язык програмирования - млм ты знаешь куда их приткнуть или оно тебе не надо. Придет время возникнет задача и ты поймешь зачем нужны маски. На пальцах тебе не объяснишь и понятно что гугл те ниче не выдал - маски это не раздел програмирования это инструмент это как знание языка и владение им этому нельзя научить. Засим откланиваюся |
| Автор: student0511 3.10.2006, 00:02 |
| У меня сейчас возникла задача! И я хочу сам допереть до её решения, но т.к., ничего не ведая на данную тему, я не знаю с чего начать. Тем более по побитовым операциям мало инфы. |
| Автор: smalcom 3.10.2006, 09:44 | ||
ну вот тебе примерчик
вот и все. теперь думай для чего ты его применишь. как грица покажи мне свой порт и я расскажу какой ты бит |
| Автор: student0511 3.10.2006, 19:20 |
| мне свой порт и я расскажу какой ты бит Гы-гы. Сильно cказано Можно любое число брать, я про 0xDF, чтобы только получался необходимый результат, т.е. в данном случае: на пятой позиции в 2-ой системе стоял 0-ой бит. Ясно. |
| Автор: student0511 3.10.2006, 20:16 |
| А если у меня положение, на которое нужно поставить 1, меняется и зависит от чего-либо. Ну, на пример, у меня есть слово. Как мне поставить единицы на те номера, которые соответствуют номеру буквы в алфавите? Вроде допёр: просто взять переменную long из одной 1 единичке и нулей. Потом сдвигать 1 на то место, которое соответствует номеру буквы и применять операцию "ИЛИ". А изначатльные переменные взять за нули. Можно же так? |
| Автор: MAKCim 3.10.2006, 21:16 |
| student0511 Если брать глобально маски в UNIX очень часто используются (и в API, и в ядре), потому как они позволяют (точнее не они, а с помощью их) очень эффективно передавать флаги для указания включения чего-нибудь куда-нибудь. Сам подумай, unsigned long для большинства 32-х разрядных платформ способен хранить 64 разных флага! А с помощью масок можно легко проверять установку определенного бита, а вместе с тем флага |
| Автор: student0511 3.10.2006, 22:20 |
| Т.е. 64 - это 8 байт чтоль? Значит весь алфавит можно забить, даже останется |
| Автор: MAKCim 4.10.2006, 08:40 | ||
ну да, спасибо за поправку |
| Автор: student0511 8.10.2006, 00:36 |
| Всё. Разобрался. Даже что-то написал А вообще задача стояла следующим образом: продемонстрировать, используя "машинное слово", работу со множествами. Кому интересно: |