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時まで

だから私は 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

polygenelubrants を恥知らずに適応させることで、はるかに高速なソリューションが得られます

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およびtoString可変基数のaもあります。

文字列を特定の幅にゼロで埋める必要がある場合は、次のような単純なものを書くことができます。

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値でも機能します。

16進数または8進数の場合は、代わりに書式設定文字列を使用できます。

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

仕様はあまり明確ではありませんが、次のマッピングが必要なようです。

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

その場合、マッピングはfromからitoになります(1 << i)(これ<<ビット単位の左シフト演算子です)。

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

何をしようとしているのかによっては、java.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
}

のようなメソッドを使用するnextSetBitnextClearBit、空の/占有されているタイムスロットを簡単に見つけることができます。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 に答える