是否可以使用某些按位運算符從日期中提取表示爲int
(格式爲YYYYMMDD,例如20110401)的月份?使用按位運算從int日期中提取月份(yyyyMMdd)
如果是這樣,該怎麼辦?
編輯: 我目前正在使用20110401%10000/100.我認爲按位可能會更快。 DateTime.Parse等對於我所要做的事情來說太慢了。
是否可以使用某些按位運算符從日期中提取表示爲int
(格式爲YYYYMMDD,例如20110401)的月份?使用按位運算從int日期中提取月份(yyyyMMdd)
如果是這樣,該怎麼辦?
編輯: 我目前正在使用20110401%10000/100.我認爲按位可能會更快。 DateTime.Parse等對於我所要做的事情來說太慢了。
你可以有效地爲位操作提取一個月,如果你代表以二進制格式的日期,例如,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 };
不,因爲按位運算符使用二進制表示該數字。您的日期使用十進制表示法進行編碼。
可以使用算術運算符但做到這一點:
int date = 20110401;
int day = date % 100;
int month = (date/100) % 100;
int year = date/10000;
如果使用C#,則解析爲'DateTime'; – Oded
+1。另外我認爲這是可能的,只是不太實際。 –
當然,這是可能的,因爲計算機在電路級進行按位操作,但是它試圖用軟件來模擬它們是毫無意義的。 –
20110301
(底爲10)爲一個整數將完全不同的位電平來表示,實際上作爲1001100101101101111011101
(基數爲2)。使用位級操作從這個位串中提取月份不會很簡單。
替代方案:
做涉及國防部的整數
轉換的int
成一個字符串,然後提取相關的數字,並將其轉換回整數一些基本的數學。
或更好的是,使用一些已經測試過的庫函數。
對於此問題,位級操作不是一個好方法。
使用按位操作可能很容易出錯,如果你可以做到的話。您可以通過使用除法和模運算操作數字來完成。
您也可以將其轉換爲字符串,解析月份字符,然後轉換回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));
thx。對於我正在嘗試做的事情,解析得太慢 – coderguy123
雖然你可以做到這一點通過按位運算,爲此可以更容易地使用數學運算。 – dasblinkenlight
唯一可能的答案是「是」或「否」。這是你真正想要的嗎? – Oded
爲什麼需要使用按位運算?這看起來過於複雜和不必要的,你試圖訪問。您似乎也列出了三種不同的語言標籤,您使用的是哪種語言?舉個例子,C#爲此提供了內置方法。 – Arran