C / C ++日期解决方案/转换

时间:2009-09-23 13:04:05

标签: c# c++ date unpack

我需要想出一种方法来将日期解压缩为可读格式。遗憾的是,我并不完全理解所使用的原始流程/代码。

根据转发给我的信息,日期是使用自定义C / Python代码打包的,如下所示;

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

例如,最近的打包日期为2107224749,相当于2009年9月22日星期二上午10:45

我理解......或者至少我很确定......&lt;&lt;正在改变位但我不确定是什么“|”实现

此外,为了解压缩代码,注释如下:

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

最终,我需要做的是使用JavaScript或ASP执行解包并转换为可读格式,但我需要更好地理解上述过程以开发解决方案。

任何帮助,提示,提示,指示,想法等都将不胜感激。

6 个答案:

答案 0 :(得分:3)

管道(|)是bitwise or,它用于将这些位组合成一个值。

提取看起来很直接,除了我建议先移动,然后masking。这使得用于掩模的常量尽可能小,这更容易管理(并且可能有点效率,尽管对于这种情况几乎不重要)。

查看二进制编写的掩码显示每个字段使用了多少位:

  • 0xfff00000设置了12位,因此年份使用了12位
  • 0x000f0000为月份设置了4位
  • 0x0000f800当天设置了5位
  • 0x000007c0设置为5位,小时
  • 0x0000003f设置了6位,分钟

答案 1 :(得分:2)

这个想法正是你所说的。执行“&lt;&lt;”只是将位移到左侧。 什么| (按位或)完成基本上是为数字添加更多位,但不覆盖已存在的位。

这一原则的证明可能有所帮助。

假设我们有一个字节(8位),我们有两个数字,每个都是4位,我们想要“组合”来制作一个字节。假设数字是二进制,1010和1011.所以我们想得到字节:10101011。

现在,我们该怎么做?假设我们有一个字节b,它被初始化为0。

如果我们取第一个要添加的数字1010,并将其移位4位,我们得到数字10100000(移位在数字的右边添加字节)。

如果我们这样做:b =(1010 <&lt; 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).

注意:这个答案有点长,我维基这个,所以,如果有人在这里有更好的解释,我会很感激你的帮助。

答案 2 :(得分:0)

是&lt;&lt;移位和|是按位OR运算符。

答案 3 :(得分:0)

答案 4 :(得分:0)

在解码部分&amp;有点明智,0xfff00000是十六进制位掩码。基本上,位掩码中的每个字符代表该位数的4位。 0是二进制0000,f是1111所以如果你看二进制操作你就是1111 1111 1111 0000 0000 ...无论日期是什么,所以基本上你得到上面三个半字节(半字节)并移动它们这样00A00000就会给你10年(十六进制)。

另请注意,| =类似于+ =它是位智能的,或者分配滚动到一个。

答案 5 :(得分: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)按位'和'仅保留最低五位中设置的位,提取原始小时值。

相关问题