Objective c 这是怎么回事&&引用;在这份声明中工作?
我知道按位AND是如何工作的,但我不明白(sourceDragMask&NSDragOperationGeneric)在这里是如何工作的,我不明白重点。有人可以向我解释吗?非常感谢Objective c 这是怎么回事&&引用;在这份声明中工作?,objective-c,cocoa,Objective C,Cocoa,我知道按位AND是如何工作的,但我不明白(sourceDragMask&NSDragOperationGeneric)在这里是如何工作的,我不明白重点。有人可以向我解释吗?非常感谢 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { NSPasteboard *pboard; NSDragOperation sourceDragMask; sourceDragMask = [sen
- (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(~
,也称为二的补码)来反转值的位,通常用于“除了”之外的任何测试