如何在此代码中使用按位运算符?

时间:2013-04-17 06:27:43

标签: objective-c bitwise-operators

我正在查看PSPDFkit示例代码并看到了这个:

NSDictionary *options = @{kPSPDFProcessorAnnotationTypes :
                               @(PSPDFAnnotationTypeNone & ~PSPDFAnnotationTypeLink)
                         };

常量PSPDFAnnotationTypeNonePSPDFAnnotationTypeLink定义如下:

// Available keys for options. kPSPDFProcessorAnnotationDict in
// form of pageIndex -> annotations.
// ..
extern NSString *const kPSPDFProcessorAnnotationTypes;

// Annotations defined after the PDF standard.
typedef NS_OPTIONS(NSUInteger, PSPDFAnnotationType) {
    PSPDFAnnotationTypeNone      = 0,
    PSPDFAnnotationTypeLink      = 1 << 1,  // Links and multimedia extensions
    PSPDFAnnotationTypeHighlight = 1 << 2,  // (Highlight, Underline, StrikeOut) - 
    PSPDFAnnotationTypeText      = 1 << 3,  // FreeText
    PSPDFAnnotationTypeInk       = 1 << 4,
    PSPDFAnnotationTypeShape     = 1 << 5,  // Square, Circle
    PSPDFAnnotationTypeLine      = 1 << 6,
    PSPDFAnnotationTypeNote      = 1 << 7,
    PSPDFAnnotationTypeStamp     = 1 << 8,
    PSPDFAnnotationTypeRichMedia = 1 << 10, // Embedded PDF videos
    PSPDFAnnotationTypeScreen    = 1 << 11, // Embedded PDF videos
    PSPDFAnnotationTypeUndefined = 1 << 31, // any annotation whose type not recognized
    PSPDFAnnotationTypeAll       = UINT_MAX
};

我理解~是按位非运算符,而&是按位和运算符,但它们在此代码中的应用目的是什么?

NSDictionary *options = @{kPSPDFProcessorAnnotationTypes :
                               @(PSPDFAnnotationTypeNone & ~PSPDFAnnotationTypeLink)
                         };

根据以下评论,上述内容可以简单地写成

NSDictionary *options = @{kPSPDFProcessorAnnotationTypes :@(PSPDFAnnotationTypeNone)};

因为它与(0 & ~2) => 0相同。添加& ~PSPDFAnnotationTypeLink部分有什么意义?

3 个答案:

答案 0 :(得分:2)

“〜”是按位 - 运算符。

作为“&amp;”按位

这些通常用于位掩码(如在您的示例中)或其他二进制操作(顾名思义)。有关wiki - Operators in C and C++的更多信息。

它们与文字无关。

答案 1 :(得分:0)

首先,我不知道obj-​​c,只有C,但我猜'&amp;'是'按位AND','〜'是按位NOT。

答案 2 :(得分:0)

它是按位NOT运算符(与许多基于C的语言相同),它反转基础值中的所有位。

因此,例如,8位值0x57(二进制0101 0111)变为1010 10000xa8

有关各种按位运算符的更完整描述,请参阅here