2012-11-13 34 views
11

Tôi nhìn DateTime Equals thực hiện:Ngày giờ so sánh với bọ ve nội bộ?

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

và sau đó nhìn vào internalticks

internal long InternalTicks 
{ 
    [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
    get 
    { 
     return (((long) this.dateData) & 0x3fffffffffffffffL); 
    } 
} 

Và sau đó tôi nhận thấy con số này: 0x3fffffffffffffffL

đó là: 4611686018427387903

Nhưng thêm thú vị là nhị phân đại diện:

00111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 
^^ 
|| 

Xin lưu ý các mũi tên

tôi có thể hiểu được nếu chỉ bên trái mũi tên có thể đã được 0 (đại diện tích cực)

  • Nhưng tại sao cái thứ hai cũng là 0?

  • Ngoài ra, tại sao tôi lại muốn nó là & với số 1111....? nếu tôi muốn hiển thị 5 Tôi không phải làm 5 & 1, chỉ cần 5.

Bất kỳ trợ giúp nào?

Trả lời

7

Bạn có thể nhận loại thông tin này từ Reference Source. Tờ khai phù hợp nhất trong 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; 

Note bản đồ như thế nào Kind giá trị cho những người hai bit.

public DateTime(long ticks, DateTimeKind kind) { 
     // Error checking omitted 
     //... 
     this.dateData = ((UInt64)ticks | ((UInt64)kind << KindShift)); 
    } 
+0

Vì vậy, đặt số không ở bên trái (2 số không) giống như so sánh mà không có DateTimeKind ... phải không? –

+1

Phải. Nó là một * mặt nạ *, sử dụng & mặt nạ toán tử ra các giá trị của các bit đó và làm cho chúng bằng không. –

+2

@RoyiNamir Có, nó bỏ qua 'Loại 'khi so sánh bằng cách che dấu nó ra. (IMO quyết định không hợp lệ) – CodesInChaos

4

Trường dateData được sử dụng như một bit field để lưu trữ nhiều giá trị ở định dạng nhỏ gọn.

Hai bit hàng đầu lưu trữ DateTimeKind, có một trong bốn giá trị có thể: Không xác định, Địa phương (nội bộ có hai biến thể) hoặc Utc. Bốn giá trị này có thể được lưu trữ trong hai bit.

62 bit dưới cùng lưu trữ các dấu tích. Hoạt động x & 0x3fffffffffffffffL là hoạt động bitwise và đôi khi được gọi là masking. Nó chỉ trả về các bit tương ứng với các ve.

+1

Thực tế nó có 4 giá trị khác nhau. Có hai biến thể khác nhau của 'Local' tương tác khác với chuyển đổi DST. – CodesInChaos

+0

vui lòng xem chỉnh sửa của tôi- nó không có giá trị gắn liền với nó. –

+0

@RoyiNamir Tôi không hiểu những gì chỉnh sửa của bạn muốn nói, nhưng câu trả lời của Mark là chính xác. – CodesInChaos