【问题标题】:<< operator in objective c enum?<< 目标 c 枚举中的运算符?
【发布时间】:2011-12-28 16:25:34
【问题描述】:

我在找东西,进入这个枚举的是苹果 UITableViewCell.h。

如果这是微不足道的,我很抱歉,但我想知道/好奇这是什么意思。

我知道

enum {
    UITableViewCellStateDefaultMask                     = 0,
    UITableViewCellStateShowingEditControlMask          = 1 << 0,
    UITableViewCellStateShowingDeleteConfirmationMask   = 1 << 1
};

谢谢

顺便说一句 发现它是学习编码的好方法,我每天尝试一次进入对象列表的头文件。

沙尼

【问题讨论】:

  • 看起来像位移(c 代码)。

标签: objective-c operators


【解决方案1】:

这些是位域标志。使用它们是因为您可以使用按位或运算符组合它们。因此,例如,您可以像这样组合它们

(UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask)

它们通过在整数中设置一位来工作。在这个例子中,在二进制中,

UITableViewCellStateShowingEditControlMask        = 0000 0001
UITableViewCellStateShowingDeleteConfirmationMask = 0000 0010

当它们被“或”在一起时,它们产生0000 0011。然后框架知道这两个标志都已设置。

&lt;&lt; 运算符是左移运算符。它改变了二进制表示。所以1 &lt;&lt; 1的意思是

0000 0001 shifted left by one bit = 0000 0010

1 &lt;&lt; 2 将等于 0000 0100

【讨论】:

  • 原谅我的无知,为什么不用1和2来代替呢?
  • 您可以改用 1,2,4,8,16,但 1,2,3,4,5 不起作用,因为它们的二进制表示重叠​​span>
【解决方案2】:

它实际上是按位移位运算符

<<  Indicates the bits are to be shifted to the left.
>>  Indicates the bits are to be shifted to the right.

所以在你的陈述中 1

【讨论】:

  • 您从IBM documentation 复制了此文本,这与IBM's terms of service 相违背。换句话说:复制文本是侵犯版权。请不要像这样从其他来源复制文本。相反,请链接到该页面。因此,请编辑您的答案并删除复制的文本。谢谢。
【解决方案3】:

C 中的一个常见技巧是在枚举值中使用按位移位运算符,以允许您将枚举值与按位或运算符组合。

那段代码相当于

enum {
    UITableViewCellStateDefaultMask                     = 0,
    UITableViewCellStateShowingEditControlMask          = 1, // 01 in binary
    UITableViewCellStateShowingDeleteConfirmationMask   = 2  // 10 in binary
};

这允许您按位将or 两个或多个枚举常量放在一起

 (UITableViewCellStateShowingEditControlMask | UITableViewCellStateShowingDeleteConfirmationMask) // == 3 (or 11 in binary)

给出一个新的常量,同时表示这两个东西。在这种情况下,单元格同时显示了一个编辑控件和一个删除确认控件,或者类似的东西。

【讨论】:

    【解决方案4】:

    这些操作数称为bitshift。位移位操作数可以优先用于 2个原因。 - 用于快速操作 - 一次使用多个布尔值。

    例如:1

    1

    移位值也必须按 1、2、4、8、16...

    排序
    typedef NS_OPTIONS(int, EntityEngineer) {
    EntityEngineeriOS = 1 << 0,
    EntityCategoryAndroid = 1 << 1,
    EntityCategoryDB = 1 << 2,
    EntityCategoryTeamLead = 1 << 16,};
    

    现在,我们要检查下一行中的多个布尔值,

    char engineer = (EntityEngineeriOS | EntityCategoryAndroid);
    

    字符 0011 = (0001 | 0010);

    if (engineer & EntityEngineeriOS) {
        NSLog(@"we are looking for a developer who can write objective c or java");
    }
    
    if (engineer & EntityCategoryDB) {
        NSLog(@"we are not looking for a DB manager");
    }
    

    结果:我们正在寻找可以编写objective c或java的开发人员

    【讨论】:

      【解决方案5】:

      这就是位移运算符。这通常用于可能具有多种行为的对象(每个枚举都是一种行为)。

      这是一个similar post,可以更好地澄清它。

      【讨论】:

        【解决方案6】:

        这些类型的运算符称为按位运算符,它对数字的位值进行运算。与其他算术运算相比,这些运算速度非常快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-28
          • 2023-03-18
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多