Простой шаблон чисел для хранения комбинаций в виде уникальной суммы - PullRequest
2 голосов
/ 15 декабря 2009

Это математическая задача, но я уверен, что она должна возникать в некоторых сценариях программирования, по крайней мере, я на это надеюсь, и мне было интересно, есть ли название для такого типа ситуации:

Предположим, у меня есть 7 предметов в серии. Для примера рассмотрим дни недели. Я хотел бы, чтобы пользователь сообщал, какие дни недели они планируют посетить на следующей неделе. Они представлены стандартной серией флажков, по одному на каждый день недели.

Я хотел бы сохранить дни, которые они выбрали в одном поле базы данных, как одно целое число.

Очевидно, что я мог бы назначать каждый день число от 1 до 7 (оставив 0 в случае, если пользователь оставит все варианты без контроля). Но затем я сталкиваюсь с проблемами, если один пользователь выбирает понедельник и вторник (1 + 2), а другой выбирает среду (3).

Я мог бы также придать каждому дню недели несколько странных уникальностей, чтобы невозможно было, чтобы любая комбинация цифр была идентична любой другой комбинации.

Я надеюсь, что вместо того, чтобы составить такую ​​серию для второго сценария, уже существует некоторое числовое свойство (возможно, квадрат каждого числа в серии и т. Д.), Которое уже хорошо используется и уважается. В идеале, это было бы настолько знакомо программированию, что получение отдельных цифр потребовало бы совсем немного ресурсов обычного языка программирования (в моем случае PHP).

Я только что это придумал, или что-то подобное существует?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2009

Использовать битовую маску - степени 2.

Monday = 2 ^ 0 = 1
Tuesday = 2 ^ 1 = 2

и так далее. Тогда понедельник и вторник становятся:

Monday | Tuesday = 3 (or 00000011 in binary)
5 голосов
/ 15 декабря 2009

Вы можете использовать

Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
Friday = 16
Saturday = 32
Sunday = 64

Комбинации будут уникальными.

Затем понедельник и вторник = 3, а среда = 4.

Это дает хорошее объяснение идеи в C #

Атрибут Enum Flags

0 голосов
/ 15 декабря 2009

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

Я помню, как однажды читал учебник по битовым наборам, в котором они использовались для хранения макетов платы для решения проблемы восьми королев.

У большинства программистов на Си была своя небольшая библиотека макросов для манипулирования битами именно для таких задач. См., Например, Битовые наборы . Они по-прежнему широко используются в коде, который выполняет прямое аппаратное манипулирование - например, включение и выключение битов в цифровом вводе / выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...