Сравнение DateTime по внутренним тикам?
Я посмотрел реализацию DateTime Equals:
public bool Equals(DateTime value)
{
return (this.InternalTicks == value.InternalTicks);
}
а затем посмотрите на innerticks
internal long InternalTicks
{
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
get
{
return (((long) this.dateData) & 0x3fffffffffffffffL);
}
}
И затем я заметил это число: 0x3fffffffffffffffL
который: 4611686018427387903
Но более интересным является его двоичное представление:
00111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
^^
||
Обратите внимание на стрелки
Я мог бы понять, была ли только стрелка влево 0
(положительное представление)
-
Но почему второй тоже 0
?
-
Кроме того, почему я хотел бы, чтобы он был &
с номером 1111....
? если я хочу отобразить 5
, мне не нужно делать 5 & 1
, всего 5.
Любая помощь?
Ответы
Ответ 1
Вы можете получить такую информацию из Reference Source. Наиболее релевантные объявления в dd/ndp/clr/src/bcl/system/datetime.cs:
private const UInt64 TicksMask = 0x3FFFFFFFFFFFFFFF;
private const UInt64 FlagsMask = 0xC000000000000000;
private const UInt64 LocalMask = 0x8000000000000000;
private const Int64 TicksCeiling = 0x4000000000000000;
private const UInt64 KindUnspecified = 0x0000000000000000;
private const UInt64 KindUtc = 0x4000000000000000;
private const UInt64 KindLocal = 0x8000000000000000;
private const UInt64 KindLocalAmbiguousDst = 0xC000000000000000;
private const Int32 KindShift = 62;
Обратите внимание на то, как значения Kind отображают эти два бита.
public DateTime(long ticks, DateTimeKind kind) {
// Error checking omitted
//...
this.dateData = ((UInt64)ticks | ((UInt64)kind << KindShift));
}
Ответ 2
Поле dateData
используется как поле бит для хранения нескольких значений в компактном формате.
Верхние два бита сохраняют DateTimeKind, который имеет одно из четырех возможных значений: Unspecified, Local (внутренне есть два варианта) или Универсальное глобальное время. Эти четыре значения могут быть сохранены в двух битах.
Нижние 62 бита сохраняют тики. Операция x & 0x3fffffffffffffffL
является побитовой и операции, также иногда называемой маскировкой. Он возвращает только биты, соответствующие тикам.