Это математическая задача, но я уверен, что она должна возникать в некоторых сценариях программирования, по крайней мере, я на это надеюсь, и мне было интересно, есть ли название для такой ситуации:
Допустим, у меня есть 7 предметов в серии. Для этого примера давайте использовать дни недели. Я хочу, чтобы пользователь сообщил, в какие дни недели он планирует прийти на следующей неделе. Они представлены стандартным набором флажков, по одному на каждый день недели.
Я хотел бы сохранить, какие дни они выбирают в одном поле базы данных, как одно целое число.
Очевидно, я мог бы присвоить каждому дню число от 1 до 7 (оставив 0, если пользователь оставит все варианты неотмеченными). Но затем я сталкиваюсь с проблемами, если один пользователь выбирает понедельник и вторник (1 + 2), а другой выбирает среду (3).
Я также мог бы придать каждому дню недели какой-нибудь причудливый уникальный характер, так что никакая комбинация цифр не могла быть идентична любой другой комбинации.
Я надеюсь, что вместо того, чтобы составлять такой ряд для второго сценария, уже существует какое-то числовое свойство (возможно, квадрат каждого числа в ряду и т. Д.), Которое уже хорошо используется и уважается. В идеале это было бы настолько хорошо знакомо с программированием, что получение отдельных цифр потребовало бы очень мало накладных расходов по сравнению с обычным языком программирования (в моем случае PHP).
Это я только что придумал, или что-то подобное существует?
3 ответа
Используйте битовую маску - степень двойки.
Monday = 2 ^ 0 = 1
Tuesday = 2 ^ 1 = 2
И так далее. Тогда понедельник и вторник станут:
Monday | Tuesday = 3 (or 00000011 in binary)
Вы могли бы использовать
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
Friday = 16
Saturday = 32
Sunday = 64
Комбинации будут уникальными.
Тогда понедельник и вторник = 3, а среда = 4.
Это дает хорошее объяснение идеи в C #
В те времена, когда память была драгоценна, программисты часто прикладывали большие усилия для кодирования настроек, параметров, макетов игр и т. Д. В виде наборов битов. В некоторые языки даже встроены битовые наборы.
Я помню, как однажды читал учебник по наборам битов, в которых они использовались для хранения макетов плат для решения проблемы восьми ферзей.
У большинства программистов на C была своя небольшая библиотека макросов манипулирования битами именно для таких задач. См., Например, наборы битов. Они по-прежнему часто используются в коде, который выполняет прямые аппаратные манипуляции - например, включает и выключает биты в цифровом вводе-выводе.
Похожие вопросы
Связанные вопросы
Новые вопросы
database
База данных представляет собой организованный сбор данных. Это коллекция схем, таблиц, запросов, отчетов, представлений и других объектов. Данные обычно организованы так, чтобы моделировать аспекты реальности таким образом, чтобы поддерживать процессы, требующие информации. Используйте этот тег, если у вас есть вопросы о разработке базы данных. Если речь идет о конкретной системе управления базами данных (например, MySQL), используйте этот тег.