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. 如何将布尔值从short中取出并放入数组中?

  2. 有人可以用

    如果 2 ^ TestBit 和 IOState

我不明白它是如何工作的

4

3 回答 3

2

@DR 和 @Jamie Clayton: 在 Visual Basic2 ^ TestBit不是按位异或运算(只是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是按位的,而不是布尔值,如果您不确定它的作用,请参阅 DR 答案中的链接。

于 2014-09-13T23:44:45.437 回答
0

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

Dim N As Short = &H13
Dim BA As New BitArray({N})
For Each B In BA
    Console.WriteLine(B)
Next
于 2013-07-30T22:03:21.813 回答
0

1)您可以测试每个位并相应地设置 bool int 数组。测试是否设置了一个简短的位:检查是否设置了一个位

2) 2 ^ TestBit 是按位异或运算,例如:

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

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

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

于 2013-07-30T21:24:26.810 回答