Как представить диапазон времени в битах - PullRequest
0 голосов
/ 20 февраля 2012

Я использую побитовую операцию для сохранения доступности с 1 битом, представляющим одну минуту.Таким образом, один день доступности может быть представлен 1 длиной (8 байтов, поэтому 60 бит из 64 бит) могут использоваться для представления 1 часа, поэтому 24 длинные будут представлять доступность в день.

Теперь у меня есть диапазонраз (например, с 2:00 до 4:00, с 15:00 до 17:00), и мне нужно перевести это в битовую маску, чтобы сравнить ее с приведенными выше значениями доступности, чтобы увидеть, доступны ли или нет диапазоны в маске (&с маской), как лучше всего перевести этот диапазон раз в биты?

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Я думаю, что это работает:

private static int getMinuteOfDay(Date date) {
    Calendar cal = new GregorianCalendar();

    cal.setTime(date);

    return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
}

private static void addAvailability(Date startTime, Date endTime, BitSet bs) {

    int startMinute = getMinuteOfDay(startTime);
    int endMinute = getMinuteOfDay(endTime);

    bs.set(startMinute, endMinute);
}

private static boolean timeIsAvailable(Date time, BitSet bs) {
    return bs.get(getMinuteOfDay(time));
}

static DateFormat TIME_FORMAT = new SimpleDateFormat("HH:MM:ss");

public static void main(String[] args) {
    BitSet availability = new BitSet();

    try {
        addAvailability(TIME_FORMAT.parse("02:00:00"), TIME_FORMAT.parse("04:00:00"), availability);
        addAvailability(TIME_FORMAT.parse("15:00:00"), TIME_FORMAT.parse("17:00:00"), availability);

        System.out.println(timeIsAvailable(TIME_FORMAT.parse("01:19:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("02:00:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("02:01:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("04:00:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("04:01:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("16:00:00"), availability));
        System.out.println(timeIsAvailable(TIME_FORMAT.parse("17:10:00"), availability));

    } catch (ParseException e) {
        throw new RuntimeException(e);
    }

}

Результаты:

false
true
true
false
false
true
false
1 голос
/ 20 февраля 2012

Уменьшите проблему до более простых шагов:

  1. преобразовать интервал (start_minute, end_minute) в битовую маску. Это можно сделать следующим образом: 1a: итерация на 24 длинных 1b: если start_minute меньше 60, преобразуйте его в long. То же самое для end_minute. 1c: Составить битовую маску, добавив биты от 1 <</li>

  2. для представления последовательности интервалов, составляющих "или" из их битовых масок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...