Преобразовать диапазон часов в цепочку битов

Я хочу сохранить часы работы компании, и я подумал об использовании цепочки для этого.
Представьте себе, что компания А, открытая в понедельник с 8:00 до 12:00 (полдень) и с 13:00 до 17:00, будет иметь цепочку битов для дня 0 (понедельник).

0000 0000 1111 0111 1000 0000

Это позволяет очень легко сохранить его в базе данных и получить его без необходимости многократного объединения и т. Д. И т. Д.

Однако это усложняет анализ пользовательского ввода для этой цепочки битов.
Я хочу дать пользователю 2 списка выбора, чтобы выбрать диапазон, в котором он может выбрать час открытия и закрытия (здесь с 8 утра до полудня).
Эти 2 списка выбора могут быть скопированы для создания второго диапазона (здесь с 13:00 до 17:00).

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

Так что это мой вопрос. Что является самым простым / чистым способом для анализа временного диапазона в цепочку битов.

Любая помощь с благодарностью.

0

Решение

Вы не храните цепочку битов как строку, а как целое число. затем вы выполняете для него побитовые сравнения, поэтому, если вы разбили день на 48 частей, это означает, что вам нужно использовать 64-разрядное целое число, где последние 16 бит просто не используются или могут использоваться для представления дней неделю.

биты следующие

/** times **/
01 00:00 02 00:30 03 01:00 04 01:30 05 02:00 06 02:30 07 03:00 08 03:30
09 04:00 10 04:30 11 05:00 12 05:30 13 06:00 14 06:30 15 07:00 16 07:30
17 08:00 18 08:30 19 09:00 20 09:30 21 10:00 22 10:30 23 11:00 24 11:30
25 12:00 26 12:30 27 13:00 28 13:30 29 14:00 30 14:30 31 15:00 32 15:30
33 16:00 34 16:30 35 17:00 36 17:30 37 18:00 38 18:30 39 19:00 40 19:30
41 20:00 42 20:30 43 21:00 44 21:30 45 22:00 46 22:30 47 23:00 48 23:30

49-57 unused

/** days of week **/
58 Sunday 59 Monday 60 Tuesday 61 Wednesday 62 Thursday 63 Friday 64 Saturday

Хорошо, теперь, как вы это используете?

Если вы хотите сказать, что бизнес был открыт в воскресенье — в субботу с 7:00 до 8:00 И с 9:00 до 10:00 вы должны сложить (используя побитовый оператор ИЛИ)

взять все «биты» сверху и ИЛИ их вместе, это можно сделать, выполнив 2 ^ (бит-1)

$hours = 2^14 | 2^15 | 2^17 | 2^18 | 2^57 | 2^58 | 2^59 | 2^60 | 2^61 | 2^62 | 2^63;

Затем сделайте ваш запрос, вы просто делаете побитовое И.

/** this is checking to see if it's open at 7am and 9am on Thursday **/
$query = (2^14 & 2^17 & 2^61);

/** this will match only if all conditions are true **/
$isOpen = $query & $hours === $query;

/** this will match if some or all conditions are true **/
$isOpen = $query & $hours > 0;

Надеюсь, это поможет вам и направит вас на правильный путь.

1

Другие решения

Других решений пока нет …