当前位置:  开发笔记 > 编程语言 > 正文

在标志上使用按位运算符

如何解决《在标志上使用按位运算符》经验,为你挑选了3个好方法。

我有四面旗帜

Current = 0x1  
Past = 0x2  
Future = 0x4  
All = 0x7

假设我收到了两个标志Past和Future(setFlags(PAST | FUTURE)).我怎么知道它Past是否在里面?同样,我怎么能告诉它Current不在其中?这样我就不必测试每种可能的组合.



1> Marc Gravell..:

如果您希望测试掩码中的所有位匹配:

if((value & mask) == mask) {...}

如果您希望测试掩码中的任何一个位匹配:

if((value & mask) != 0) {...}

当您测试多个事物的值时,差异最明显.

要测试排除:

if ((value & mask) == 0) { }



2> Vilx-..:

首先 - 使用带有FlagAttribute的枚举.这就是它的用途.

[Flags]
public enum Time
{
    None = 0
    Current = 1,
    Past = 2,
    Future = 4
    All = 7
}

然后测试就像这样:

if ( (x & Time.Past) != 0 )

或这个:

if ( (x & Time.Past) == Time.Past )

如果"过去"是旗帜的组合并且您想要测试它们,后者将更好地工作.

设置是这样的:

x |= Time.Past;

取消设置是这样的:

x &= ~Time.Past;


@Roylee-噢,地狱。我打错了 应该是`1 | 2 = 3`。:)

3> Brian Rasmus..:

您可能还需要添加一个扩展方法是这样

  enum states {
     Current = 0x1,
     Past = 0x2,
     Future = 0x4,
     All = 0x7
  };

  static bool Is(this states current, states value) {
     return (current & value) == value;
  }

然后你可以这样做:

 if(state.Is(states.Past)) {
    // Past
 }

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有