2010-04-18 84 views
2

我知道如何按位與工作,但我不明白(sourceDragMask & NSDragOperationGeneric)在這裏工作,我不明白這一點。是否有人可以向我解釋?非常感謝。這個「&」在這個陳述中是如何工作的?

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 
{ 
    NSPasteboard *pboard; 
    NSDragOperation sourceDragMask; 

    sourceDragMask = [sender draggingSourceOperationMask]; 
    pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSColorPboardType]) 
    { 
     if (sourceDragMask & NSDragOperationGeneric) 
     { 
      return NSDragOperationGeneric; 
     } 
    } 

    return NSDragOperationNone; 
} 

回答

2

我知道如何按位與工作,但我不明白怎麼做(sourceDragMask & NSDragOperationGeneric)在這裏工作,我不明白這一點。

NSDragOperationGeneric很可能是2的冪,這意味着它只有一個位集。這是故意的:位掩碼幾乎全部被定義爲兩個(單個位)的冪以啓用像這樣的位掩碼操作。

正如您所知,按位與運算只評估在雙方中設置的那些位。如果一方只設置一位(NSDragOperationGeneric),那麼該操作將有效地測試該位是否設置在另一方。

這就是操作的要點:測試NSDragOperationGeneric位是否被設置。有一個問題:如你所知,一個成功的按位AND測試將評估爲已測試的位掩碼,而不是 1.因此,例如,如果您測試的位掩碼定義爲0x100( 1後跟8個清除位),然後將該結果分配給一個BOOL(這是一個signed char)變量,您將賦值給變量0!這就是爲什麼你有時會看到這樣的代碼:

BOOL supportsCopyOperation = ((dragOperations & NSDragOperationCopy) == NSDragOperationCopy); 

或本:

BOOL supportsCopyOperation = ((dragOperations & NSDragOperationCopy) != 0); 

或本:

BOOL supportsCopyOperation = !!(dragOperations & NSDragOperationCopy); 

其他位掩碼操作包括按位OR(|)至將值設置爲一個值(例如,return NSDragOperationCopy | NSDragOperationMove;),並將位置爲NOT(~,也稱爲二進制補碼)以反轉值的位,通常用於「任何事情」但不是測試。

6

NSDragOperationGeneric是位掩碼—大概兩—這意味着只有一個數位被置電源。當且僅當在sourceDragMask中設置相應的位時,位&sourceDragMask將產生非零輸出。

或CEO(我不知道NSDragOperationGeneric實際值):

sourceDragMask:   00011010 
NSDragOperationGeneric: 00001000 
a & b:     00001000 

總之,if語句會成功,如果sourceDragMask有`NSDragOperationGeneric」位設置。

3

sourceDragMask就是所謂的位掩碼:一個表示多個布爾標誌的整數。它被宣佈爲NSDragOperation類型的變量,實際上typedef來自NSUInteger,實際上就是這樣。

首先,&運算符就是所謂的「按位AND」,它只需要兩個數字AND s中的每個位來創建一個新值。例如,0011 1001 & 0101 1010 == 0001 0001 - 57 & 90 = 17。同樣,|運算符執行按位或運算。使用這些運算符,我們可以分別將這些1和0中的每一個用作布爾標誌。

因此,如果,例如,sourceDragMask是值12,這告訴我們什麼?在二進制中,12表示爲0000 11008 | 4,其根據NSDraggingInfo Protocol ReferenceNSDragOperationPrivate | NSDragOperationGeneric。所以如果我們&這與NSDragOperationGeneric,我們得到4了,這是非零,因此是正確的。這樣,我們可以檢查一個位掩碼是否包含某個標誌。