Objective c 这是怎么回事&&引用;在这份声明中工作?

Objective c 这是怎么回事&&引用;在这份声明中工作?,objective-c,cocoa,Objective C,Cocoa,我知道按位AND是如何工作的,但我不明白(sourceDragMask&NSDragOperationGeneric)在这里是如何工作的,我不明白重点。有人可以向我解释吗?非常感谢 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { NSPasteboard *pboard; NSDragOperation sourceDragMask; sourceDragMask = [sen

我知道按位AND是如何工作的,但我不明白(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;
}
-(nsdragooperation)draggingented:(id)发送方
{
NSPasteboard*pboard;
NSDRAGO操作源DRAGMASK;
sourceDragMask=[sender DragingSourceOperationMask];
pboard=[发送方拖动粘贴板];
如果([[pboard types]包含对象:NSColorPboardType])
{
if(sourceDragMask和NSDragOperationGeneric)
{
返回nsdragoOperationGeneric;
}
}
返回nsdragooperationne;
}

nsdragooperationgeneric
是位掩码-可能是二的幂-意味着数字中只设置了一位。当且仅当在
sourceDragMask
中设置了相应位时,使用
sourceDragMask
的逐位
将产生非零输出

假设(我不知道
nsdragooperationgeneric
的实际值):


简言之,如果
sourceDragMask
设置了“nsdragooperationgeneric”位,if语句将成功。

sourceDragMask
就是所谓的位掩码:一个表示许多布尔标志的整数。它被声明为类型为
nsdragooperation
的变量,实际上是
typedef
NSUInteger
派生出来的-实际上就是这样

首先,
&
运算符被称为“按位AND”,它只需取两个数字
中的每个位来创建一个新值。例如,
00111001&0101010==0001 0001
-
57&90=17
。类似地,
|
运算符执行按位OR运算。使用这些运算符,我们可以分别使用这些1和0作为布尔标志

例如,如果
sourceDragMask
12
的值,这告诉我们什么?在二进制中,
12
表示为
0000 1100
,或
8 | 4
,根据,它是
nsdragooperation private | nsdragooperation generic
。因此,如果我们使用
nsdragooperationgeneric
&
这个,我们得到
4
,它是非零的,因此是真的。通过这种方式,我们可以检查位掩码是否包含某个标志

我知道按位AND是如何工作的,但我不明白(sourceDragMask和nsdragooperationgeneric)在这里是如何工作的,我不明白重点


nsdragoOperationGeneric
很可能是二的幂,这意味着它只有一个位集。这是经过深思熟虑的:位掩码几乎都定义为两个(单个位)的幂,以启用像这样的位掩码操作

如您所知,按位AND运算只计算两侧设置的位。如果一侧仅设置了一个位(
nsdragooperationgeneric
),则该操作将有效地测试另一侧是否设置了该位

这就是操作的要点:测试是否设置了
nsdragooperationgeneric

有一个问题:正如您所知,成功的按位AND测试将评估为测试的位掩码,而不是1。因此,例如,如果您测试定义为0x100的位掩码(1后跟8个清除位),然后将该结果分配给
BOOL
(这是一个
signed char
)变量,您将为该变量分配零!这就是为什么有时会看到这样的代码:

BOOL supportsCopyOperation = ((dragOperations & NSDragOperationCopy) == NSDragOperationCopy);
或者这个:

BOOL supportsCopyOperation = ((dragOperations & NSDragOperationCopy) != 0);
BOOL supportsCopyOperation = !!(dragOperations & NSDragOperationCopy);
或者这个:

BOOL supportsCopyOperation = ((dragOperations & NSDragOperationCopy) != 0);
BOOL supportsCopyOperation = !!(dragOperations & NSDragOperationCopy);
其他位掩码操作包括按位或(
)来设置值中的位(
返回nsdragooperationcopy | nsdragooperationmove;
),以及按位NOT(
~
,也称为二的补码)来反转值的位,通常用于“除了”之外的任何测试