int
ビット単位の演算子を使用して、(YYYYMMDD の形式、例: 20110401)として表される日付から月を抽出することは可能ですか?
もしそうなら、どうすればそれを行うことができますか?
編集:私は現在 20110401 % 10000 / 100 を使用しています。ビット単位の方が速いと思いました。DateTime.Parse などは、私がやろうとしていることに対して遅すぎます。
int
ビット単位の演算子を使用して、(YYYYMMDD の形式、例: 20110401)として表される日付から月を抽出することは可能ですか?
もしそうなら、どうすればそれを行うことができますか?
編集:私は現在 20110401 % 10000 / 100 を使用しています。ビット単位の方が速いと思いました。DateTime.Parse などは、私がやろうとしていることに対して遅すぎます。
いいえ、ビット単位の演算子は数値の2 進数表現で機能するためです。日付は10 進表現を使用してエンコードされます。
ただし、算術演算子を使用して実行できます。
int date = 20110401;
int day = date % 100;
int month = (date / 100) % 100;
int year = date / 10000;
20110301
整数としての (base 10) は、実際には1001100101101101111011101
(base 2) のように、ビット レベルではまったく異なる方法で表現されます。このビット文字列から月を抽出するためにビット レベルの操作を使用することは、簡単なことではありません。
代替案:
整数の mod を含むいくつかの基本的な計算を行います
を文字列に変換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));
日付を 2 進形式 (たとえば、10 進数ではなく 1 日を 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 };