0

日付を読み取り可能な形式に解凍する方法を考え出す必要があります。残念ながら、使用された元のプロセス/コードを完全には理解していません。

私に転送された情報によると、日付は次のようにカスタム C/Python コードを使用してパックされました。

  date = year << 20;
  date |= month << 16;
  date |= day << 11;
  date |= hour << 6;
  date |= minute;

たとえば、最近のパック日付は 2107224749 で、これは 2009 年 9 月 22 日火曜日の午前 10 時 45 分に相当します。

私は理解しています....または少なくとも私はかなり確信しています.... <<はビットをシフトしていますが、「|」が何であるかわかりません 達成します。

また、コードをアンパックするために、次のようにメモを読みます。

year = (date & 0xfff00000) >> 20;
month = (date & 0x000f0000) >> 16;
day = (date & 0x0000f800) >> 11;
hour = (date & 0x000007c0) >> 6;
minute = (date & 0x0000003f);

最終的には、JavaScript または ASP を使用してアンパックを実行し、読み取り可能な形式に変換する必要がありますが、ソリューションを開発するには、上記のプロセスをよりよく理解する必要があります。

ヘルプ、ヒント、ヒント、ポインター、アイデアなどをいただければ幸いです。

4

6 に答える 6

3

パイプ ( |) はビットごとの orであり、ビットを単一の値に結合するために使用されます。

抽出は簡単に見えますが、最初にシフトしてからマスキングすることをお勧めします。これにより、マスクに使用される定数が可能な限り小さく保たれ、管理が容易になります (この場合はほとんど問題になりませんが、少し効率的になる可能性があります)。

バイナリで記述された使用マスクを見ると、各フィールドに使用されているビット数がわかります。

  • 0xfff00000 には 12 ビットが設定されているため、年には 12 ビットが使用されます。
  • 0x000f0000 には月の 4 ビットが設定されています
  • 0x0000f800 には、その日の 5 ビットが設定されています
  • 0x000007c0 には 5 ビットが設定されています。
  • 0x0000003f には 6 ビットが設定されています。
于 2009-09-23T13:06:50.327 に答える
2

おっしゃる通りの考え方です。「<<」を実行すると、ビットが左にシフトされます。なに | (bitwise or) は、基本的に数値にビットを追加することですが、既に存在するものを上書きすることはありません。

この原則のデモンストレーションが役立つ場合があります。

1 バイト (8 ビット) があり、それぞれが 4 ビットの 2 つの数値があり、それらを「組み合わせて」1 バイトを作成するとします。数値が 2 進数で 1010 と 1011 であると仮定します。したがって、10101011 というバイトで終わる必要があります。

さて、これをどうするか?0 に初期化されたバイト b があるとします。

加算する最初の数値 1010 を 4 ビット シフトすると、数値 10100000 が得られます (シフトにより数値の右側にバイトが追加されます)。

b = (1010 << 4) とすると、b の値は 10100000 になります。

しかし今、前のビットに触れずに、さらに 4 ビット (0011) を追加したいと考えています。これを行うには、| を使用できます。これは、| 演算子は、数値がゼロの場合はすべて「無視」します。そのため、次のようにします。

10100000 (b's current value)
|
00001011 (the number we want to add)
We get:
10101011 (the first four numbers are copied from the first number, 
          the other four numbers copied from the second number).

注: この回答は少し長くなりました。私はこれをウィキで作成しています。そのため、ここで誰かが説明する方法についてより良いアイデアを持っている場合は、助けていただければ幸いです。

于 2009-09-23T13:23:34.280 に答える
0

はい、<< はビットをシフトし、| は ビットごとの OR 演算子です。

于 2009-09-23T13:08:33.230 に答える
0

デコード セクションの & はビット単位で、0xfff00000 は 16 進数のビット マスクです。基本的に、ビット マスクの各文字は数値の 4 ビットを表します。0 はバイナリで 0000、f は 1111 であるため、バイナリで操作を見ると、1111 1111 1111 0000 0000 となります。 00A00000 が年に 10 (16 進数の A) を与えるようにします。

また、|= は += に似ていることに注意してください。ビット単位であるか、代入が 1 つにまとめられます。

于 2009-09-23T13:26:12.917 に答える
0

いくつかの実用的なヒントを追加するだけです:

minute = value & ((1 << 6)-1);
hour = (value >> 6) & ((1<<5)-1);  // 5 == 11-6 == bits reserved for hour
...

1 << 5位置 5 にビットを作成し (つまり、32=00100000b)、
(1<<5)-1最下位 5 ビットが設定されたビット マスクを作成します (つまり、31 == 00011111b)。

x & ((1<<5)-1)最下位 5 ビットに設定されたビットのみを保持するビット単位の「AND」を実行し、元の時間値を抽出します。

于 2009-09-23T14:18:22.313 に答える
0

これらのリンクが役立つ場合があります。

http://www.gamedev.net/reference/articles/article1563.asp

http://compsci.ca/v3/viewtopic.php?t=9893

于 2009-09-23T13:18:50.683 に答える