2

对不起朋友我做错了。我又犯了这个错误。真的很抱歉。

这就是问题。

我有一个时间范围

int Starttime = 2 which mean(02:00)
int enttime =  8 which mean(08:00)

我想要时间总和,例如

     00:00 1  
     01:00 2    
     02:00 4  -----
     03:00 8   R
     04:00 16  a
     05:00 32  n
     06:00 64  g
     07:00 128 e
     08:00 256 -----

直到23:00

所以我需要 totalRange = 256+128+64+32+16+8+4 ;

应该又是这样对不起。

谢谢

4

4 回答 4

3

该表表明您要使用此函数将时间的小时值映射到整数值:

int value = (int) Math.pow(2, hourValue);

或者,换句话说, 00:00h 将映射到 2 0, 12:00h 到 2 12等等。

现在,如果您需要开始时间和结束时间的总和,您可以简单地使用上面的函数并添加值:

int totalrange = (int) Math.pow(2, starttime) + (int) Math.pow(2, endtime);

现在,如果您有 starttime=2 和 endtime=23,这将给出一个结果(以二进制形式编写):

01000000 00000000 00000100

无耻地采用多基因润滑剂更快的解决方案

int totalrange = (1 << starttime) + (1 << endtime);

这是可行的,因为 2 i等于 (1 << i)。

于 2010-08-24T09:38:48.823 回答
2
    System.out.println(Integer.toBinaryString(2+24)); // 11010

这是使用的Integer.toBinaryString方法。还有带有可变基数的toHexString,toOctalString和 a 。toString

如果您需要将字符串零填充到特定宽度,您可以编写如下简单的内容:

static String binaryPadded(int n, int width) {
    String s = Integer.toBinaryString(n);
    return "00000000000000000000000000000000"
                .substring(0, width - s.length()) + s;
}

//...
System.out.println(binaryPadded(2+24, 8)); // 00011010      

有多种方法可以将字符串零填充到固定宽度,但这适用于任何int值。

对于十六进制或八进制,您可以改用格式化字符串

    System.out.println(String.format("%04X", 255)); // 00FF

规范不是很清楚,但看起来你想要这个映射:

0 -> 1
1 -> 2
2 -> 4
3 -> 8
4 -> 16
:
i -> 2一世

在这种情况下,您的映射是从i(1 << i)(这<<按位左移运算符)。

    System.out.println(
        (1 << 2) + (1 << 4)
    ); // 20

请注意,根据您要执行的操作,您也可以考虑使用 ajava.util.BitSet代替。


BitSet示范

这可能完全不合时宜,但假设您正在做某种区间算术,那么BitSet可能是适合您的数据结构(另请参见 ideone.com):

import java.util.BitSet;
//...

static String interval(BitSet bs) {
    int i = bs.nextSetBit(0);
    int j = bs.nextClearBit(i);
    return String.format("%02d:00-%02d:00", i, j);
}

public static void main(String[] args) {
    BitSet workTime = new BitSet();
    workTime.set(9, 17);
    System.out.println(interval(workTime));
    // 09:00-17:00

    BitSet stackOverflowTime = new BitSet();
    stackOverflowTime.set(10, 20);
    System.out.println(interval(stackOverflowTime));
    // 10:00-20:00

    BitSet busyTime = new BitSet();
    busyTime.or(workTime);
    busyTime.or(stackOverflowTime);
    System.out.println(interval(busyTime));
    // 09:00-20:00
}

请注意,类似nextSetBit和的方法nextClearBit可以很容易地找到空的/占用的时隙。你也可以做intersect, or, and, 等等。

这个简单的例子只找到第一个间隔,但你可以让它更复杂,并对不连续的时间间隔进行各种算术。

于 2010-08-24T09:21:23.390 回答
1
Integer.toBinaryString(i) 

将整数参数的字符串表示形式返回为以 2 为底的无符号整数。

于 2010-08-24T09:19:37.770 回答
1

要计算时间间隔的长度,您必须这样做

int totalrange = endtime - starttime;

也许这就是您正在寻找的:

int startTime = 2;
int endTime = 24;
int range = endTime - startTime;

System.out.println(range + " can be expressed as the following sum:");
for (int size = 1; range > 0; size <<= 1, range >>= 1)
    if ((range & 1) != 0)
        System.out.format("+ %02d:00%n", size);

输出:

22 can be expressed as the following sum:
+ 02:00
+ 04:00
+ 16:00
于 2010-08-24T09:38:14.417 回答