【问题标题】:Possible to bitmask more values than an int can hold?可以位掩码比 int 可以容纳的更多值吗?
【发布时间】:2015-02-11 16:52:29
【问题描述】:

我有 36 个彼此相关的 Bool 标志。有什么方法可以枚举这个,还是我唯一的选择是数组/其他东西?

起初我尝试为此使用位掩码枚举,但我意识到这些会溢出枚举大小并给我带来不好的结果。

我不需要像选项掩码那样组合这些(它们彼此独立),只需分组即可。

谢谢!

【问题讨论】:

    标签: objective-c c arrays enums


    【解决方案1】:

    在 C 中,枚举基本上只是一个 int;因此,枚举仅限于整数的最大大小。 如果你想拥有任意数量的标志,你可以使用位域:

    struct flags {
        unsigned f0 :1;
        unsigned f1 :1;
        unsigned f2 :1;
        unsigned f3 :1;
        unsigned f4 :1;
        unsigned f5 :1;
        unsigned f6 :1;
        unsigned f7 :1;
    
    
        ...
    
        unsigned f35 :1;
    };
    
    struct flags f;
    
    f.f33 = 1;
    f.f14 = 0;
    

    【讨论】:

      【解决方案2】:

      如果我理解您的问题,那么以下方法可能有效:

      enum flags
      {
        .. 36 appropriatly named entries
      };
      
      long long int myFlags = 0LL;
      
      int getFlag( enum flags whichFlag )
      {
          return( (myFlags&(1<<whichFlag)? 1:0 );
      }
      
      void setFlag( enum flags whichFlag )
      {
          myFlags |= (1<<whichFlag);
      }
      

      【讨论】:

      • 这不适用于int 至少不是 36 位的架构(如 x86)。事实上,它调用了未定义的行为,因为 36 大于 32 位整数的最大允许移位。
      • 我试过了,它似乎工作正常 - 所要做的就是首先像 1ULL
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2013-01-01
      • 1970-01-01
      • 2013-12-26
      • 2010-12-27
      • 2011-04-15
      • 2017-12-19
      相关资源
      最近更新 更多