确定Integer中哪些位高?

时间:2015-06-08 16:48:55

标签: vb.net binary integer

我有一个32位整数,我正在从运动控制器读取。整数表示在控制器中设置的错误位。我有九(9)个错误,或错误位,任何时候都可以设置为高。在任何情况下,可以同时设置一个或全部九个比特,或者它们之间的任何组合。明确地确定存在错误是很容易的,因为如果整数的值是> 0,然后我们知道有错误。它出现的困难部分是如何识别哪些错误(位)被设置,因为有无数种不同的位组合可以在任何时候设置为高。我开始尝试掩饰(如果整数> 0和< 96,然后checkbox1.checked = True)等,但这似乎是一场噩梦,因为有这么多组合。有没有更有效的方法来做到这一点?可以设置为高的整数位是:(2,6,7,8,11,12,13,14和21)

3 个答案:

答案 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 togetherarithmatic 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