11

私は DateTime Equals の実装を見ました:

public bool Equals(DateTime value)
{
    return (this.InternalTicks == value.InternalTicks);
}

そして internalticks を見てください

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(正の表現)

  • しかし、なぜ 2 つ目も0?

  • また、なぜ私はそれを数字に&したいのでしょう1111....か? 表示したい場合は、5する必要はありません5 & 1。5つだけです。

何か助けはありますか?

4

2 に答える 2

7

この種の情報は参照元から取得できます。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値がこれら 2 つのビットにどのようにマップされるかに注意してください。

    public DateTime(long ticks, DateTimeKind kind) {
        // Error checking omitted
        //...
        this.dateData = ((UInt64)ticks | ((UInt64)kind << KindShift));
    }
于 2012-11-13T12:27:28.890 に答える
4

このdateDataフィールドは、複数の値をコンパクトな形式で格納するためにビット フィールドのように使用されます。

上位 2 ビットにはDateTimeKindが格納されます。これには、Unspecified、Local (内部的に 2 つのバリアントがあります)、または Utc の 4 つの値のいずれかが含まれます。これらの 4 つの値は 2 ビットで格納できます。

下位 62 ビットにはティックが格納されます。操作はビットごとの AND 操作であり、 maskingx & 0x3fffffffffffffffLとも呼ばれます。ティックに対応するビットのみを返します。

于 2012-11-13T12:22:51.797 に答える