【问题标题】:Enum bitwise masking limitations枚举按位掩码限制
【发布时间】:2012-08-17 12:35:08
【问题描述】:

我试图用位掩码枚举文件类型,以便在按位 OR 上快速轻松地区分:

typedef enum {

    FileTypeDirectory = 1,
    FileTypePIX = 2,
    FileTypeJPG = 4,
    FileTypePNG = 8,
    FileTypeGIF = 16,
    FileTypeHTML = 32,
    FileTypeXML = 64,
    FileTypeTXT = 128,
    FileTypePDF = 256,  
    FileTypePPTX = 512,

    FileTypeAll = 1023

} FileType;

我的 OR 手术一直有效,直到 128,之后它失败了。 64 位 Mac OSX 上的枚举是否仅限于字节数据类型? (2^7=128)

【问题讨论】:

  • 您的代码中的枚举保证足够大以容纳1023,因此问题很可能与您的“后来失败”检查有关。
  • 嗯....可能对发布 OR'ing 失败的代码很有用....
  • @JoachimPileborg,我认为那里的答案具有误导性,因为它谈到的是枚举类型对象的存储大小而不是常量。

标签: objective-c c enums


【解决方案1】:

C 中的所有enum 常量 都是int 类型,而不是枚举本身的类型。所以限制不在于enum 变量的存储大小,而在于int 的位数。

我不太了解objective-c(因为它也被标记了),但它不应该与C有太大的偏差。

【讨论】:

    【解决方案2】:

    我不太清楚你是如何使用 OR 运算符的,但它对我来说很适合你的 typedef

    FileType _fileType = FileTypeGIF | FileTypePDF | FileTypePPTX;
    NSLog(@"filetype is : %d", _fileType);
    

    结果是:

    filetype is : 784
    

    这是正确的值,因为16 + 256 + 512 恰好是784


    (它已仅在真实设备上测试过。)

    【讨论】:

    • 我也对其进行了测试,发现故障必须在其他地方。枚举工作正常!
    • @LowNoise,那么您是如何体验的,正如您所提到的,我的 OR 手术一直工作到 128,之后却失败了
    • 它实际上发生在其他地方,我提到的不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多