2012-06-13 55 views
-2

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

如果是這樣,該怎麼辦?

編輯: 我目前正在使用20110401%10000/100.我認爲按位可能會更快。 DateTime.Parse等對於我所要做的事情來說太慢了。

+0

雖然你可以做到這一點通過按位運算,爲此可以更容易地使用數學運算。 – dasblinkenlight

+5

唯一可能的答案是「是」或「否」。這是你真正想要的嗎? – Oded

+1

爲什麼需要使用按位運算?這看起來過於複雜和不必要的,你試圖訪問。您似乎也列出了三種不同的語言標籤,您使用的是哪種語言?舉個例子,C#爲此提供了內置方法。 – Arran

回答

0

你可以有效地爲位操作提取一個月,如果你代表以二進制格式的日期,例如,5位月的一天,4位數爲月份數,其餘爲一年,而不是十進制數字。對於你的例子,日期將是(2011 < < 9)+(4 < < 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 }; 
8

不,因爲按位運算符使用二進制表示該數字。您的日期使用十進制表示法進行編碼。

可以使用算術運算符但做到這一點:

int date = 20110401; 

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

如果使用C#,則解析爲'DateTime'; – Oded

+0

+1。另外我認爲這是可能的,只是不太實際。 –

+0

當然,這是可能的,因爲計算機在電路級進行按位操作,但是它試圖用軟件來模擬它們是毫無意義的。 –

3

20110301(底爲10)爲一個整數將完全不同的位電平來表示,實際上作爲1001100101101101111011101(基數爲2)。使用位級操作從這個位串中提取月份不會很簡單。

替代方案:

  • 做涉及國防部的整數

  • 轉換的int成一個字符串,然後提取相關的數字,並將其轉換回整數一些基本的數學。

  • 或更好的是,使用一些已經測試過的庫函數。

對於此問題,位級操作不是一個好方法。

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)); 
+0

thx。對於我正在嘗試做的事情,解析得太慢 – coderguy123

相關問題