在枚举中使用二进制值映射位值。 1 = 1、2 = 10、4 = 100 等。然后您可以使用枚举分配变量。您还可以将这些值组合成一个新的枚举(参见 ProtocolX)。
要给出初始值,只需添加要使用的枚举即可。
' switch bits on 1, 5, 13, 14, 16
i = FrameSectionEnum.ProtocolBit1 + FrameSectionEnum.ProtocolBit5 +
FrameSectionEnum.AddressableBit13 +
FrameSectionEnum.TaggedBit14 + FrameSectionEnum.OriginBit16
PrintBits(i)
要打开某些位并保留其他位,请使用 OR。
' switch bits on 2 and 3 using a combined value. preserve other bits
i = SetOn(i, FrameSectionEnum.ProtocolX)
PrintBits(i)
要关闭某些位并保留其他位,请使用 AND 和 NOT。
' switch bits off 1 and 5
i = SetOff(i, FrameSectionEnum.ProtocolBit1 + FrameSectionEnum.ProtocolBit5)
PrintBits(i)
实用功能列表:
检查某些位是否打开:
Function CheckBit(i As Integer, bit As FrameSectionEnum) As Integer
Return If((i And bit) = bit, 1, 0)
End Function
设置位,保留其他位:
Function SetOn(i As Integer, bit As FrameSectionEnum) As Integer
Return i Or bit
End Function
设置位关闭,保留其他位:
Function SetOff(i As Integer, bit As FrameSectionEnum) As Integer
Return i And (Not bit)
End Function
完整代码:
Module Module1
Enum FrameSectionEnum
ProtocolBit1 = 1
ProtocolBit2 = 2
ProtocolBit3 = 4
ProtocolBit4 = 8
ProtocolBit5 = 16
ProtocolBit6 = 32
ProtocolBit7 = 64
ProtocolBit8 = 128
ProtocolBit9 = 256
ProtocolBit10 = 512
ProtocolBit11 = 1024
ProtocolBit12 = 2048
AddressableBit13 = 4096
TaggedBit14 = 8192
OriginBit15 = 16384
OriginBit16 = 32768
ProtocolX = ProtocolBit2 + ProtocolBit3
End Enum
Sub Main()
Dim i As UInt16 = 0
' switch bits on 1, 5, 13, 14, 16
i = FrameSectionEnum.ProtocolBit1 + FrameSectionEnum.ProtocolBit5 +
FrameSectionEnum.AddressableBit13 +
FrameSectionEnum.TaggedBit14 + FrameSectionEnum.OriginBit16
PrintBits(i)
' switch bits on 2 and 3 using a combined value. preserve other bits
i = SetOn(i, FrameSectionEnum.ProtocolX)
PrintBits(i)
' switch bits off 1 and 5
i = SetOff(i, FrameSectionEnum.ProtocolBit1 + FrameSectionEnum.ProtocolBit5)
PrintBits(i)
Console.ReadKey(True)
End Sub
Function SetOn(i As Integer, bit As FrameSectionEnum) As Integer
Return i Or bit
End Function
Function SetOff(i As Integer, bit As FrameSectionEnum) As Integer
Return i And (Not bit)
End Function
Function CheckBit(i As Integer, bit As FrameSectionEnum) As Integer
Return If((i And bit) = bit, 1, 0)
End Function
Sub PrintBits(i As Integer)
Console.Write(CheckBit(i, FrameSectionEnum.OriginBit16))
Console.Write(CheckBit(i, FrameSectionEnum.OriginBit15))
Console.Write(CheckBit(i, FrameSectionEnum.TaggedBit14))
Console.Write(CheckBit(i, FrameSectionEnum.AddressableBit13))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit12))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit11))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit10))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit9))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit8))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit7))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit6))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit5))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit4))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit3))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit2))
Console.Write(CheckBit(i, FrameSectionEnum.ProtocolBit1))
Console.WriteLine()
End Sub
End Module