对不起朋友我犯了一个错误。我又犯了这个错误。我真的很抱歉。
这就是问题。
我有一个像
这样的时间范围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 -----
和soo直到23:00
所以我需要totalRange = 256 + 128 + 64 + 32 + 16 + 8 + 4;
它应该是这样的 对不起再次。
由于
答案 0 :(得分: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
无耻地适应polygenelubricants much faster solution:
int totalrange = (1 << starttime) + (1 << endtime);
这是有效的,因为2 i 等于(1 <&lt;&lt; i)。
答案 1 :(得分:2)
System.out.println(Integer.toBinaryString(2+24)); // 11010
这使用Integer.toBinaryString
方法。还有toHexString
,toOctalString
和带有可变基数的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
值。
对于十六进制或八进制,您可以改为使用formatting string:
System.out.println(String.format("%04X", 255)); // 00FF
规范不是很清楚,但看起来你想要这个映射:
0 -> 1
1 -> 2
2 -> 4
3 -> 8
4 -> 16
:
i -> 2
i
在这种情况下,您的映射是从i
到(1 << i)
(<<
是bitwise left-shift operator)。
System.out.println(
(1 << 2) + (1 << 4)
); // 20
请注意,根据您尝试执行的操作,您也可以考虑使用java.util.BitSet
。
BitSet
演示这可能完全偏离标记,但假设您正在进行某种间隔算术,那么BitSet
可能是您的数据结构(see also on 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
等
这个简单的例子只能找到第一个间隔,但你可以使它更复杂,并在非连续的时间间隔上做各种算术。
答案 2 :(得分:1)
Integer.toBinaryString(i)
返回整数参数的字符串表示形式,作为基数为2的未对齐整数。
答案 3 :(得分: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