我有一个32位整数,我正在从运动控制器读取。整数表示在控制器中设置的错误位。我有九(9)个错误,或错误位,任何时候都可以设置为高。在任何情况下,可以同时设置一个或全部九个比特,或者它们之间的任何组合。明确地确定存在错误是很容易的,因为如果整数的值是> 0,然后我们知道有错误。它出现的困难部分是如何识别哪些错误(位)被设置,因为有无数种不同的位组合可以在任何时候设置为高。我开始尝试掩饰(如果整数> 0和< 96,然后checkbox1.checked = True)等,但这似乎是一场噩梦,因为有这么多组合。有没有更有效的方法来做到这一点?可以设置为高的整数位是:(2,6,7,8,11,12,13,14和21)
答案 0 :(得分:1)
您可以使用位操作和计数器来确定设置了哪些位,如:
int[] set_bits = new int[9]
int currentBit = 0
for (int i = 0; i < 32; i++)
{
firstBit = errorNumber & 0x1 //firstBit >= 1 only if it is set
if (firstBit >= 1)
{
set_bits[currentBit] = 1
currentBit++
}
errorNumber = errorNumber >> 1 //shift the bits down by one for the next bit
}
然后,您可以根据set_bits的哪个索引进行操作。对不起,我不熟悉VB,但我很肯定VB有类似的东西,如果不是这样的话。我认为比特移位和二元运算符的一般概念是你想要解决的问题。
以下是logical bitwise operators ('and'-ing numbers together和arithmatic operations (bit shifting numbers)
答案 1 :(得分:1)
您希望使用适当的掩码进行按位AND操作:
if error bit 6:
00111010 <-- input from your controller
00100000 <-- mask value for error bit 6
--------
00100000 <-- output bits are set only where the input matches the mask
if no error bit 6:
00011010 <-- input from your controller
00100000 <-- mask value for error bit 6
--------
00000000 <-- output bits are set only where the input matches the mask
我还没有方便检查VB.Net,但https://stackoverflow.com/a/4046492/478656表明AND
运算符可以正常工作。 (32是设置的第6位的整数值)
if (errorValue AND 32) = 32 Then Checkbox1.checked = True
你可能会受益于有一个解释层,告诉你这些位是什么意思(比如第6位是电机烧坏&#39;,然后设置一个布尔说法&#39; motorBurntOutFlag = true&#39; ;,所以你不是在猜猜 - 魔法数字。
e.g。 https://stackoverflow.com/a/666254/478656
Enum controllerErrors as Integer
powerFail = 2
incompatibleCommand = 32
...
End Enum
if (errorValue AND controllerErrors.powerFail) > 0 Then
'code
end if
答案 2 :(得分:0)
一种简洁的方法是定义一个包含所有错误的枚举 他们的位。
Public Enum MotionControlerErrors As Integer
NoMorePower = 1 << 2
Explosion = 1 << 6
SomeOtherError = 1 << 7
...
End Enum
然后你可以用这种方式建立一个错误列表:
Function BuildMaskList( ErrorResult As integer ) As List(Of Boolean)
Dim ResultList As New List( Of Boolean)
For Each err In MotionControlerErrors
ResultList.Add ( (err AND ErrorResult) = err )
End For
Return ResultList
End Function