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

时间:2017-02-09 20:36:03

标签: vb.net conditional

我正在处理一些遗留的VB代码(.aspx页面),并且我看到了这种格式的条件:

If (someVar And {integer_x}) = {integer_x} Then

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

这段代码有什么作用?

1 个答案:

答案 0 :(得分:9)

这是一个按位检查。这article说明了一切。

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

当你进行按位运算时,你会找到一个“开”的位,或者值为1.如果你找someVar And 8,那就是说“某些值的第四位是否从右边开始在位置“。

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

现在,除非这是针对具有电子系统的接口或解析原始数据,否则我会说这是使用Flags属性执行Enum的一种非常过时的方式。

让我们快进到今天:

<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

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

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

因此:

Enum PizzaToppings
  Sauce = 1 << 0
  Pepperoni = 1 << 1
'...