2017-02-09 51 views
3

我在一些遗留VB代码(.aspx页面中)和遍布我看到这种格式的条件语句的地方工作:If(someVar And 8)= 8那么 - 这是什么意思?

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

我也看到了各种整数,但他们似乎都是2的幂(8,64,256,16384等)。

这段代码做了什么?

回答

9

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

(但只有链路答案是令人难以接受的,所以......)

当你做位操作,你看一点那是“上”,或者其值为1。如果你看看someVar And 8 ,这就是说“一些变种在右侧的位置上是否有第四位”。

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

现在,除非这是为了与电子系统的接口或解析原始数据,否则我认为这是一种非常过时的方式,可以用Enum和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 

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

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

现在好多了.... – Steve

+0

@Steve我想先得到基本答案:) – MPelletier

+0

@MPelletier - 是的,这是一个遗留系统建于90年代后期:) – jbyrd