2017-02-09 36 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