使用按位运算从int日期中提取月份(yyyyMMdd)

时间:2012-06-13 21:41:56

标签: c# c++ c bitwise-operators

是否可以使用某些按位运算符从表示为int的日期(格式YYYYMMDD,例如20110401)中提取月份?

如果是这样,怎么办呢?

编辑: 我目前正在使用20110401%10000 / 100.我认为按位可能会更快。 DateTime.Parse等对我想做的事情来说太慢了。

5 个答案:

答案 0 :(得分:8)

不,因为按位运算符使用数字的二进制表示。您的日期使用十进制表示法进行编码。

你可以使用算术运算符来实现:

int date = 20110401;

int day = date % 100;
int month = (date / 100) % 100;
int year = date / 10000;

答案 1 :(得分:3)

作为整数的

20110301(基数10)在位级上的表示方式完全不同,实际上为1001100101101101111011101(基数2)。使用位级操作从该位串中提取月份不是直截了当的。

备选方案:

  • 在整数

  • 上做一些涉及mod的基本数学
  • int转换为字符串,然后提取相关数字并将其转换回整数。

  • 或者更好的是,为此使用一些已经测试过的库函数。

比特级操作不是解决此问题的好方法。

答案 2 :(得分:1)

如果您可以执行此操作,则使用按位运算可能会出错。您可以通过使用除法和模运算来操作数字来完成此操作。

您也可以将其转换为字符串,解析月份字符,然后转换回int。

这是C#中的一些示例代码

int date = 20119420;
int month = 0;

// using good old math
month = (date / 100) % 100;

// using string parsing
month = int.Parse(date.ToString().Substring(4, 2));

答案 3 :(得分:0)

如果以二进制格式表示日期,则可以使用按位运算有效地提取月份,例如,月份的5位,月份的4位,其余的这一年,而不是十进制数字。对于您的示例,日期将是(2011 <&lt;&lt; 9)+(4&lt;&lt; 5)+ 1(当然不等于20110401)。要使用按位运算从这种表示中提取字段:

int year = date >> 9;
int month = (date >> 5) & 0xF;
int day = date & 0x1F;

Mark Byers提到的另一种方法是使用结构,例如,

typedef struct {
    short year;
    char  month;
    char  day;
} Date;

您可以在堆栈中传递这些内容,按名称提取字段,并将其初始化为

Date d = { 2011, 4, 1};

或者,在C99中,

Date d = { .year = 2011, .month = 4, .day = 1 };

答案 4 :(得分:0)

所以我知道这是一篇非常老的文章,但这实际上是我们班的作业,我只使用按位操作就具有压缩日期和提取日期功能:

    //Compress Date
    int compressDate(int month, int day, int year)
    {
        int date = year;
        date <<= 4;
        date |= month;
        date <<= 6;
        date |= day;

        return date;

    }

    //Extract Date
    void extractDate(int date, int& month, int& day, int& year)
    {
        int dayMask = 63;
        int monthMask = 15;
        int yearMask = 4095;


        day = date & dayMask;
        date >>= 6;
        month = date & monthMask;
        date >>= 4;
        year = date & yearMask;
    }

当您使用compressDate(1,25,2019)之类的命令执行compress date函数时,它将返回数字:2067545,而extractDate函数仅以相反的顺序工作。这样做的原因是按位运算符比使用数学运算符要快。