我正在更新一些旧代码以与一些较新的应用程序兼容,我遇到了以下代码:
'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
这就是前一个程序员存储不同布尔值的方式(简而言之)。出于我们新软件的目的,我宁愿将它们存储在一个数组中。
如何从短片中取出布尔值并进入阵列?
有人可以通过
解释此代码中发生的事情如果2 ^ TestBit和IOState
我不明白它是如何运作的
答案 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