是否可以使用某些按位运算符从表示为int
的日期(格式YYYYMMDD,例如20110401)中提取月份?
如果是这样,怎么办呢?
编辑: 我目前正在使用20110401%10000 / 100.我认为按位可能会更快。 DateTime.Parse等对我想做的事情来说太慢了。
答案 0 :(得分:8)
不,因为按位运算符使用数字的二进制表示。您的日期使用十进制表示法进行编码。
你可以使用算术运算符来实现:
int date = 20110401;
int day = date % 100;
int month = (date / 100) % 100;
int year = date / 10000;
答案 1 :(得分:3)
20110301
(基数10)在位级上的表示方式完全不同,实际上为1001100101101101111011101
(基数2)。使用位级操作从该位串中提取月份不是直截了当的。
备选方案:
在整数
将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函数仅以相反的顺序工作。这样做的原因是按位运算符比使用数学运算符要快。