If (someVar And 8) = 8 Then -- 这是什么意思?

If (someVar And 8) = 8 Then -- what does this mean?

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

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

而且我见过各种各样的整数,但它们似乎都是 2 的幂(8、64、256、16384 等)。

这段代码有什么作用?

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

(但是 link-only 答案不受欢迎,所以...)

当您进行按位运算时,您会查找 "on" 或值为 1 的位。如果您查找 someVar And 8,则表示 "does someVar have its 4th bit on from the right at the on position"。

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

现在,除非这是用于与电子系统的接口或解析原始数据,否则我认为这是一种非常过时的方式来执行具有 Flags 属性的 Enum 可以执行的操作。

让我们fast-forward到今天:

<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
'...