如果(someVar和8)= 8那么 - 这是什么意思?

jby*_*yrd 3 vb.net conditional

我正在使用一些遗留的VB代码(.aspx页面),我看到这种格式的条件:

If (someVar And {integer_x}) = {integer_x} Then
Run Code Online (Sandbox Code Playgroud)

我已经看过各种整数,但它们似乎都是2的幂(8,64,256,16384等).

这段代码有什么作用?

MPe*_*ier 9

这是一个按位检查.这篇文章说明了一切.

(但仅限链接的答案令人不悦,所以...)

当你进行按位操作时,你会寻找一个"开"的位,或者值为1.如果你寻找someVar And 8,那就是说"某些值在开启位置右边的第4位是否开启".

8翻译为二进制0001000.如果someVar在该位置有1,逻辑运算符And将返回0001000,或8.然后检查是否相等.请注意,someVar仍然可以有其他位.它可能值9(0001001),这仍然意味着条件是真的.

现在,除非这是针对具有电子系统的接口或解析原始数据,否则我会说这是一种真正过时的方式来执行Enum with the Flags属性可以做的事情.

让我们快进到今天:

<Flags()> _
Enum PizzaToppings
  Sauce = 1
  Pepperoni = 2
  Mushrooms = 4
  Peppers = 8
  Bacon = 16
  Ham = 32
  Cheese = 64
  Pineapple = 128
End Enum

'...

Dim myToppings As PizzaToppings = PizzaToppings.Sauce Or PizzaToppings.Cheese 'Use Or to combine or + 

'...

If myToppings.HasFlag(PizzaToppings.Sauce) Then
    addSauce()
End If
Run Code Online (Sandbox Code Playgroud)

如果你不想打扰权力,你也可以做一点转变:

1 << 0 is 2^0 is 1
1 << 1 is 2^1 is 2
1 << 2 is 2^2 is 4
1 << 3 is 2^3 is 8
Run Code Online (Sandbox Code Playgroud)

从而:

Enum PizzaToppings
  Sauce = 1 << 0
  Pepperoni = 1 << 1
'...
Run Code Online (Sandbox Code Playgroud)

  • 对于那些好奇的人来说,将示例中的枚举设置为2的连续幂(而不仅仅是1,2,3 ......)可能会有所帮助,以便如果你想将它们中的一些组合起来(让我们说你想要酱,pepporoni,*和*蘑菇),你可以参考这些数字作为这些数字的加法(在我的例子中,它将是1 + 2 + 4 = 7),并且任何数字的增加数量将是永远不会与任何其他单一价值发生冲突,或者是模棱两可的.很好的答案和例子; 超级有帮助 - 谢谢! (2认同)