将short转换为boolean数组

时间:2013-07-30 19:57:27

标签: vb.net boolean flags short

我正在更新一些旧代码以与一些较新的应用程序兼容,我遇到了以下代码:

'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

  3. 我不明白它是如何运作的

3 个答案:

答案 0 :(得分:2)

@ D.R。和@Jamie Clayton: 2 ^ TestBit 是Visual Basic中的按位XOR操作(只有Xor)。它存在于许多C语言中,如C#链接,但在VB中, 是幂操作,其结果始终为Double值;这显然不利于比特测试。在任何情况下,我都会使用1 << TestBit,这正是您想要的,并且不会遭受无用的类型转换。

您发布的代码让我假设短值未完全使用,只是前12位。所以我们有一个12长度的数组。如果IOState是枚举,它提供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。答案中的链接。

答案 1 :(得分:0)

1)您可以测试每个位并相应地在数组中设置bool。测试是否在短时间内设置了一个位: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

因此,它检查是否设置了不同的位。

答案 2 :(得分:0)

您可以尝试使用BitArray这是一个迭代器附带的简单类,以便For...Each覆盖它。

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