我需要想出一种方法来将日期解压缩为可读格式。遗憾的是,我并不完全理解所使用的原始流程/代码。
根据转发给我的信息,日期是使用自定义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执行解包并转换为可读格式,但我需要更好地理解上述过程以开发解决方案。
任何帮助,提示,提示,指示,想法等都将不胜感激。
答案 0 :(得分:3)
管道(|
)是bitwise or,它用于将这些位组合成一个值。
提取看起来很直接,除了我建议先移动,然后masking。这使得用于掩模的常量尽可能小,这更容易管理(并且可能有点效率,尽管对于这种情况几乎不重要)。
查看二进制编写的掩码显示每个字段使用了多少位:
答案 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)
按位'和'仅保留最低五位中设置的位,提取原始小时值。