我有一个工作日的面具编号,代表一周中几天的总和:
SUNDAY = ((2**0))
MONDAY = ((2**1))
TUESDAY = ((2**2))
weekdays_mask = SUNDAY + MONDAY + TUESDAY
因此,如果我将这些天的总和存储在数据库中,我该如何执行相反的过程并找到我必须根据weekdays_mask
值显示的星期几。有谁知道这样做的方法?谢谢!
答案 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}