Сравнение 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 является побитовой и операции, также иногда называемой маскировкой. Он возвращает только биты, соответствующие тикам.