如何将时间范围表示为位

时间:2012-02-20 17:36:56

标签: java bit-manipulation

我使用按位运算来存储1位代表一分钟的可用性。因此,有一天的可用性可以表示为1长(8个字节,因此64位中的60位)可用于表示1小时,因此24个长度将表示每天的可用性。

现在我有一段时间(例如2:00-4:00,15:00到17:00)我需要将其转换为位掩码,以便与上述多个可用性进行比较,以查看范围在掩码中可用或不可用(& with mask)将这个时间范围转换为位的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

将问题简化为更简单的步骤:

  1. 将间隔(start_minute,end_minute)转换为位掩码。这可以按如下方式完成: 1a:迭代24长。 1b:如果start_minute小于60,则将其转换为long。 end_minute也是如此。 1c:编写位掩码,添加1<

  2. 中的位
  3. 表示一系列间隔,使其“或”成为其位掩码

答案 1 :(得分:1)

我认为这有效:

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