关于C#:C# – 包装日期,月份,年份

C# - packing date, month, year

在C键的编程中,作者给出了一个示例(使用源代码),说明如何将日期(年、月、日——以数字表示)打包为32位整数。在示例中,作者打包信息的方式如下:

1
int iDate = (iYear << 9) | (iMonth << 5) | iDay;

如果我正确地理解了这一点,左移位9只给我们一个512的值(如果计算每个位的位置,则为1023)。但是,我注意到在运行程序时,可以存储2014(年)这样的值。这么小的价值怎么可能做到这一点?我误解了这段代码吗?没有多少阅读、观看或玩弄代码能帮助我净化空气。


这个移位并不能代表一年所能承受的最大值(即使你在计算中犯了错误,但这不是我们向左移位9的原因)。使用移位可以定义将用于每个值的范围。下面是一个ASCII,它显示了值移位后,值将如何组织在Int32中。

1
2
11111111111111111111111 1111 11111
-----------yyyyyyyyyyyY mmmM ddddD

因为一天的值最多可以是31,5位就足够了(32个可能的值)。本月,我们需要4位(16个可能值),以适应我们的12个可能值。如果我们希望智能日期计划在2048年后继续,那么今年至少需要12位。我们左边还有一个地方可以住很长时间。

所以我们把月值改变了5倍,年值改变了9倍。这也是Int16不够的原因,我们需要多于16位来存储日期。


如果从1开始,9的左移位可能会得到512。然而,我认为这里要做的是,假设最低的9位用于存储数字,而实际上较低的9位不用于存储该值。向左移动9将"已用位"移动到9的左边,释放9个最低位。在这9位中,您只能存储512个不同的值(0到511),但这不是您多年来使用的值。

把它作为一张图片,它的结果是这样的,假设值不"重叠"(它们不应该出现,除非突然有16个或更多的月,或32天或更多的天)

1
syyy yyyy yyyy yyyy yyyy yyym mmmd dddd

在可预见的未来,这些年有足够的空间。