Найти дни недели по значению маски в будние дни - PullRequest
0 голосов
/ 17 мая 2018

У меня есть номер маски будних дней, который представляет сумму некоторых дней недели:

SUNDAY = ((2**0))
MONDAY = ((2**1))
TUESDAY = ((2**2))
weekdays_mask = SUNDAY + MONDAY + TUESDAY

Итак, если я храню сумму этих дней в БД, как я могу выполнить обратный процесс и определить, какие дни недели мне нужно будет отобразить, основываясь на значении weekdays_mask.Кто-нибудь знает способ сделать это?Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Вы можете инициализировать их шаблоном, подобным 0b0000, и вместо +/- вместо этого использовать двоичную арифметику;

SUNDAY    = 0b000000
MONDAY    = 0b000001
TUESDAY   = 0b000010
WEDNESDAY = 0b000100
THURSDAY  = 0b001000
FRIDAY    = 0b010000
SATURDAY  = 0b100000

weekend = SATURDAY | SUNDAY
workday = MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY

is_friday_weekend = weekend & FRIDAY
# => 0

is_friday_workday = workday & FRIDAY
# => 16 (Which is not 0; so yes)
0 голосов
/ 17 мая 2018

Я уверен, что есть более чистый способ, немного здесь мои 2 цента, основанные на трех днях, но работают и добавляя больше дней:

SUNDAY = ((2**0))
MONDAY = ((2**1))
TUESDAY = ((2**2))
weekdays_mask_7 = SUNDAY | MONDAY | TUESDAY
weekdays_mask_6 = MONDAY | TUESDAY
weekdays_mask_5 = SUNDAY | TUESDAY
weekdays_mask_4 = TUESDAY
weekdays_mask_3 = SUNDAY | MONDAY
weekdays_mask_2 = MONDAY
weekdays_mask_1 = SUNDAY

days = %w[SUNDAY MONDAY TUESDAY]

weekdays_mask = weekdays_mask_7 # just to play

day_array = (weekdays_mask.to_s(2).split("").map(&:to_i).reverse).zip(days)
day_array.select{|e| p e[1] if e[0] == 1}
0 голосов
/ 17 мая 2018

+ немного необычно. Обычно вы используете побитовое ИЛИ для объединения значений:

SUNDAY | MONDAY | TUESDAY #=> 7
SUNDAY | MONDAY           #=> 3

и поразрядно И для проверки конкретного значения:

days = SUNDAY | MONDAY

days & SUNDAY  #=> 1
days & MONDAY  #=> 2
days & TUESDAY #=> 0   <- zero indicates bit not set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...