2013-07-30 66 views
0

我更新了一些舊代碼是用一些較新的應用程序兼容,我碰到下面的代碼來:轉換短布爾陣列

'Display I/O Status 
IOState = get_io_status() 
For TestBit = 0 To 11 
    If 2^TestBit And IOState Then 
     T_IOState(TestBit).BackColor = System.Drawing.ColorTranslator.FromOle(&HFF00) 
    Else 
     T_IOState(TestBit).BackColor = System.Drawing.ColorTranslator.FromOle(&HFF) 
    End If 
Next TestBit 

這是以前的程序員是如何存儲不同布爾值(以簡短)。爲了我們新軟件的目的,我寧願將它們存儲在一個數組中。

  1. 我怎樣才能把布爾變換成數組?

  2. 有人能請解釋一下什麼是這個代碼發生與

    如果2^TestBit而IOState

我不明白它是如何工作

+0

我認爲這個使用非常有效的按位運算符的代碼可以滿足Brian Kernighan(http://en.wikiquote.org/wiki/Brian_Kernighan)的一句名言:「調試比編寫代碼困難一倍。因此,如果您儘可能巧妙地編寫代碼,那麼根據定義,您的智能不足以調試它。「 –

回答

0

1)您可以測試每個位並相應地設置bool int數組。測試如果一個位在很短的設置:Checking if a bit is set or not

2)2^TestBit是bitwise XOR運算,例如:

2 ... 0010 
when TestBit = 3 
3 ... 0011 

2^TestBit = 0001 -> greater than 0 -> if(2 ^TestBit) would match 

所以,它會檢查是否不同位設置。

0

你可以試試BitArray這是一個簡單的類,帶有一個迭代器,以便你可以在其上覆蓋For...Each

Dim N As Short = &H13 
Dim BA As New BitArray({N}) 
For Each B In BA 
    Console.WriteLine(B) 
Next 
2

@ D.R。和@Jamie Clayton: 2^TestBit不是在Visual Basic中按位異或運算(它只是Xor)。它在許多C語言的語言中,例如你已經鏈接的C#,但是在VB中,這個的電源操作,其結果總是Double的值;這對於位測試顯然不是很好。在任何情況下,我會用1 << TestBit,這正是你想要的,不會遭受無用的類型轉換。

您發佈的代碼讓我假設短期價值並未完全使用,只是前12位。所以我們有一個12長度的數組。如果IOState是Enum,它提供HasFlag函數。

Dim BoolArray(11) As Boolean ' Yes it's 11, the highest index, not the length. 
For TestBit = 0 To 11 
    BoolArray(TestBit) = IOState.HasFlag(1 << TestBit) 
Next 

這會得到你的Boolean數組。 你可以有自己的HasFlag功能與

Function HasFlag(iostate As Short, testFlag As Short) As Boolean 
    Return (iostate And testFlag) <> 0 
End Function 

And這裏是按位,而不是布爾,如果你不能確定做什麼,看到D.R.的答案的鏈接。