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

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

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

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

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

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

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

2
Anthony 15 Дек 2009 в 11:41

3 ответа

Лучший ответ

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

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

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

Monday | Tuesday = 3 (or 00000011 in binary)
6
David M 15 Дек 2009 в 11:43
О, я вижу! Это не только позволяет избежать перекрытия (что имеет смысл из ответа наблюдателя), но и выражение целого числа в двоичном формате фактически дает включение / выключение для каждого возможного дня недели. Вау, может мне стоит пойти в класс или что-то в этом роде. Спасибо!
 – 
Anthony
15 Дек 2009 в 11:51

Вы могли бы использовать

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

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

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

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

Атрибут Enum Flags

5
Community 23 Май 2017 в 13:24

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

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

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

0
clartaq 15 Дек 2009 в 23:05