根据工作日的掩码值查找星期几

时间:2018-05-17 11:38:37

标签: ruby-on-rails ruby

我有一个工作日的面具编号,代表一周中几天的总和:

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

因此,如果我将这些天的总和存储在数据库中,我该如何执行相反的过程并找到我必须根据weekdays_mask值显示的星期几。有谁知道这样做的方法?谢谢!

3 个答案:

答案 0 :(得分:2)

+有点不常见。您通常使用按位OR 来组合值:

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

按位AND 检查特定值:

days = SUNDAY | MONDAY

days & SUNDAY  #=> 1
days & MONDAY  #=> 2
days & TUESDAY #=> 0   <- zero indicates bit not set

答案 1 :(得分:1)

您可以通过类似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)

答案 2 :(得分:0)

我确定有一种更干净的方式,在这里我的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}