Определите, какой бит установлен для даты, используя сложные битовые маски.

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

Sunday = 1
Monday = 2
Tuesday = 4
...
Saturday = 64

Я использую битовую маску, потому что несколько (по крайней мере, один) дней могут быть установлены на 1.

Проблема

Затем я получаю дату. Любая дата. И на основе date.DayOfWeek мне нужно вернуть первую ближайшую дату после нее, установленную в битовой маске. Таким образом, мой метод может возвращать тот же день или любой другой день между датой и датой + 6 .

Пример 1

Моя битовая маска определяет, что все дни установлены на 1. В этом случае мой метод должен возвращать ту же дату, потому что в битовой маске задано date.DayOfWeek .

Пример 2

Моя битовая маска определяет, что только среда имеет значение 1. Если моя входящая дата - вторник, я должен вернуть date + 1 (то есть среда). Но если входящая дата - четверг, я должен вернуть date + 6 (опять же среда).

Вопрос

Каков самый быстрый и элегантный способ решить эту проблему? Почему еще и самый быстрый? Потому что мне нужно запускать это несколько раз, поэтому, если я могу использовать какую-то кешированную структуру, чтобы быстрее получать даты, это было бы предпочтительнее.

Не могли бы вы предложить какое-нибудь руководство, чтобы решить эту проблему элегантным способом? Я не хочу, чтобы в итоге получился длинный спагетти-код, полный ifs и switch-case ...

Важно : важно отметить, что битовая маска может быть изменена или заменена чем-то другим, если это способствует повышению производительности и простоте кода. Так что битовая маска не высечена в камне ...

Возможный подход

Было бы разумно сгенерировать массив смещений за день и сохранить его в переменной частного класса. Сгенерируйте его один раз и повторно используйте впоследствии, например:

return date.AddDays(cachedDayOffsets[date.DayOfWeek]);

Таким образом, мы вообще не используем битовую маску, и единственная проблема заключается в том, как сгенерировать массив как можно быстрее и с максимально коротким кодом.

7
задан Robert Koritnik 11 October 2011 в 05:58
поделиться