powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / в 32 бита больше 32 свойств
22 сообщений из 22, страница 1 из 1
в 32 бита больше 32 свойств
    #38207003
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
WinAPI очень много свойств реализует с помощью битовых полей. Например:
Код: plaintext
1.
2.
3.
#define IS_EDITABLE 0x00000001
if (fileAttributes & IS_EDITABLE)
...


У меня вопрос, существуют ли какие-нибудь практики именования, позволяющие вместо 32х свойств положить в битовое поле из 32 бит больше свойств? Через комбинации, взаимоисключения и т.д.?
Заранее спасибо!
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207029
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
32 свойства это если только одна единичка в каком то разряде.
А если их несколько то 2^32.
Только зачем это?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207050
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, количество комбинация я знаю.
Вопрос в том, что если есть такая маска 0x00000011, где 1й нижний бит это isModifiable, а 5й это isResizable, то как отличить их от isLarge в котором используется и 1й и 5й бит?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207061
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
if (isModifiable == (isModifiable & MASK) )


Или вы про что?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207095
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду, что проверив MASK на isModifiable и isLarge я получу для обоих случаев true, так как когда устанавливался isLarge, автоматически установился и isModifiable. Может быть есть практики, позволяющие обойти это ограничение?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207099
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЯ имею ввиду, что проверив MASK на isModifiable и isLarge я получу для обоих случаев true, так как когда устанавливался isLarge, автоматически установился и isModifiable. Может быть есть практики, позволяющие обойти это ограничение?

Поэтому флаги кодируются как степени двойки, чтобы избежать подобных коллизий.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207121
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и как следствие флагов всего может быть 32 для 32 разрядного представления , где код каждого флага определяется следующей формулой:
f(i) = 2^i

Код: plaintext
1.
2.
3.
4.
5.
6.
 i - f(i)
0 - 1
1 - 2
2 - 4
...
31 - 2^31
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207132
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков,
спасибо, это я тоже понимаю :). То есть не существует методик/способов (не технических, а логических) увеличить количество флагов?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть взаимоисключаюшие флаги то надо их все кодировать одним и тем же набором бит. Т.е. ни в коем случае не делать так что первый бит означает одно, второй - другое, а оба вместе в определенной комбинации что-то третье.

Например есть 3 состояния:
1. Сон
2. Пробуждение
3. Работа

Кодируем (в двоичной):
01 - Сон
10 - Пробуждение
11 - Работа

Проверять так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
switch(dwFlag & 3)
{
  case 1: 
   ... сон
  case 2: 
   ... пробуждение
  case 3: 
   ... работа
  default:
   ... неизвестное состояние
}


устанавливать как-то так
Код: plaintext
1.
2.
dwNewState = 2;
dwFlag = (dwFlag ^ (dwFlag & 3)) | dwNewState;


PS в данном примере 3 это маска (11 в двоичной), синтаксис забыл как двоичные писать.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GАнатолий Широков,
спасибо, это я тоже понимаю :). То есть не существует методик/способов (не технических, а логических) увеличить количество флагов?
Думаю что не существует. Иначе это была-бы революция в архиваторах. Но ты можешь разбить маску на 2 части.
Одну часть использовать как множество флажков. А дугую - перечисление констант. Пример 32 = 16+16.
Комбинация из 16 флагов + 65536 взаимоисключающих констант.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207199
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Ну можно же хранить не битовые поля, а код комбинации, тогда, если комбинаций разных много, а допустимых не более 2^32, то получится, что битовых полей в этом 4 байтовом слове будет больше, чем 32.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207225
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если дефайнами описывать мой пример, то как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#define STATEMASK 0x00000003
#define STATE_SLEEP 0x00000001
#define STATE_WAKE 0x00000002
#define STATE_WORK 0x00000003
...
if(dwFlag & STATEMASK == STATE_WORK)
...



По сути флаг это однобитовая переменная в которую можно записать два состояния (0 и 1). В двухбитовую переменную можно записать 4 и т.д. в общем случае в n-битовую - 2 в степени n значений.
Сколько таких битовых секций войдет в 32 бита зависит от количества групп взаимоисключающих флагов в твоей задаче.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207232
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmayton,

Ну можно же хранить не битовые поля, а код комбинации, тогда, если комбинаций разных много, а допустимых не более 2^32, то получится, что битовых полей в этом 4 байтовом слове будет больше, чем 32.
Префиксный код?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207351
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T ,
спасибо большое! Ваш пример понятен.

mayton
Думаю что не существует. Иначе это была-бы революция в архиваторах. Но ты можешь разбить маску на 2 части.
Одну часть использовать как множество флажков. А другую - перечисление констант. Пример 32 = 16+16.
Комбинация из 16 флагов + 65536 взаимоисключающих констант.
Спасибо! А Вы могли бы более подробнее объяснить как это можно использовать для моей задачи?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207683
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMasterZivmayton,

Ну можно же хранить не битовые поля, а код комбинации, тогда, если комбинаций разных много, а допустимых не более 2^32, то получится, что битовых полей в этом 4 байтовом слове будет больше, чем 32.
Префиксный код?

Нет, словарь комбинаций с идентификатором (4 байта) и в качестве значения хранить не комбинацию, а идентификатор в словаре.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207689
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G Dima T ,
спасибо большое! Ваш пример понятен.

mayton
Думаю что не существует. Иначе это была-бы революция в архиваторах. Но ты можешь разбить маску на 2 части.
Одну часть использовать как множество флажков. А другую - перечисление констант. Пример 32 = 16+16.
Комбинация из 16 флагов + 65536 взаимоисключающих констант.
Спасибо! А Вы могли бы более подробнее объяснить как это можно использовать для моей задачи?

А у тебя разве была какая-то задача ?

авторУ меня вопрос, существуют ли какие-нибудь практики именования, позволяющие вместо 32х свойств положить в битовое поле из 32 бит больше свойств? Через комбинации, взаимоисключения и т.д.?


На вопрос тебе ответили...
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38207967
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv ,
задачи не было, был вопрос :). Вы правы, мне действительно ответили, но из ответов я только понял схему предложенную Dima_T . Вашу схему и схему mayton я не понял. Подскажите, что правильно хоть искать, что бы понять схемы?
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38208013
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще я бы посоветовал в таком случае использовть union c битовыми полями
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38208029
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G,

ты действительно думаешь что кто-то тут предложит как обойти теорию вероятностей? А она гласит что 32 независимых события могут произойти/не произойти 2^32 способами. Если докажешь что 33 независимых события могут произойти 2^32 способами - получишь нобелевскую премию по математике :)

Оттуда же события с тремя и более состояниями. Для максимальной плотности их совместного хранения надо просто оторваться от двоичной логики.
Например есть три события (флага) разной емкости:
1. два состояния
2. три состояния
3. пять состояний
минимум чтобы хранить все возможные состояния надо емкость = 2 * 3 * 5 = 30, т.е. 5 бит (2^5 = 32)
но так хранить неудобно, т.к. извлекать значение конкретного флага ресурсоёмко, т.к. требуется выполнять деление.
намного эффективнее будет работать если ввести немного избыточности и выделить отдельные биты под каждый флаг, тогда надо будет 1 + 2 + 3 = 6 бит чтобы хранить отдельно каждый флаг. Тут получаем более высокую производительность, т.к. битовые операции выполняются гораздо быстрее, как минус - получаем избыточность: используем 2^6 = 64 значения для хранения 30-ти.
Что важнее: плотность хранения или скорость обработки? решать разработчику исходя из конкретной решаемой задачи.
Озвучь свою конкретную задачу, тебе посоветуют способы ее решения.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38208030
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GПодскажите, что правильно хоть искать, что бы понять схемы?У тридцатидвухразрядного слова - 2^32 состояний.
Расчёт числа состояний вашего варианта масок/констант - оставляется (вам) в качестве домашнего упражнения.

P.S. Если ваших состояний будет больше, чем 2^32 - переходить вам на long long или менять схему кодирования (ваших) состояний.
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38208042
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Наверное действительно мне нужна конкретная задача. Появиться, вернусь :)
Всем удачи!
Dima T , спасибо за подробнее объяснение!
...
Рейтинг: 0 / 0
в 32 бита больше 32 свойств
    #38208761
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G MasterZiv ,
задачи не было, был вопрос :). Вы правы, мне действительно ответили, но из ответов я только понял схему предложенную Dima_T . Вашу схему и схему mayton я не понял. Подскажите, что правильно хоть искать, что бы понять схемы?

Да ничего не искать, думать.

Берёшь составляешь словарь всех состояний, допустимых.
Он должен содержать само состояние (состояние каждого бита, которых может быть > 32), и идентификатор состояния (unsigned int).
В поле вместо самих битов будешь хранить идентификатор состояния, а само состояние битов будешь получать из словаря состояний.
Кол-во допустимых состояний при этом естественно не должно превышать 2^32. Количество бит в состоянии может быть любым, может быть и много больше 32.

Словарь при этом нужно реализовать либо в виде массива с доступом по идентификатору, либо в виде хэш-таблицы по идентификатору состояния.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / в 32 бита больше 32 свойств
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]