Java中的位总和

时间:2010-08-24 09:16:18

标签: java bit

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

这就是问题。

我有一个像

这样的时间范围
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;

它应该是这样的 对不起再次。

由于

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方法。还有toHexStringtoOctalString和带有可变基数的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
}

请注意,nextSetBitnextClearBit等方法可以轻松找到空/占用的时段。您还可以执行intersectorand

这个简单的例子只能找到第一个间隔,但你可以使它更复杂,并在非连续的时间间隔上做各种算术。

答案 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