【问题标题】:Storing 4 bits from a byte in VB.NET在 VB.NET 中存储一个字节的 4 位
【发布时间】:2011-03-31 21:04:49
【问题描述】:

在 VB.NET 中从一个字节存储 4 位的最佳方法是什么?最好的意思是:

  • 最直接的 Byte 类型存储方法。
  • 在执行按位运算时最容易使用。
  • 将位直接转换为其他类型。

通过其构造函数将它们存储在 BitArray 中会反转位的顺序。这意味着尝试获取第一位的值将需要在 BitArray 的最后一个条目中查找该值。 将它们存储在布尔数组中并没有提供从字节转换的直接方法,并且会阻碍到其他类型的转换。

【问题讨论】:

  • 为什么不把它们保存在Byte 中?
  • 主要是因为这需要清除其他 4 位并将相关位移动为租用有效位。因此,如果我要完成所有这些工作,可能会有更好的方法来解决问题。

标签: .net vb.net byte bits bitarray


【解决方案1】:

将其保存在字节中:

Dim b1 As Boolean = (value And &H01) = 1
Dim b2 As Boolean = (value And &H02) = 1
Dim b3 As Boolean = (value And &H04) = 1
Dim b4 As Boolean = (value And &H08) = 1

清除位也很简单:

Dim value As Byte = (oldValue And &HF0)

如果要保留最不重要的值,只需反转十六进制值:

Dim value As Byte = (oldValue And &H0F)

【讨论】:

  • 清除未使用位的解决方案假定它们位于最高有效位一侧。
  • 我已经准备好接受你的回答,仅仅是因为你的坚持ChaosPandion!不幸的是,我有多种情况提示了我的问题,其中一些情况在字节内的不同位置有位(有时多于或少于 4 个)。我确实意识到我可以专门为每种情况创建一个位掩码,这就是您所提议的。但是,我希望有一种更紧凑的方式。与 BitArray 类似,但没有糟糕之处(也就是位反转)。
  • @Charles - 接受任何有助于您完成工作的答案。如果您找到更好的答案,我只会哭一会儿。 :)
【解决方案2】:

如果您不喜欢 BitArray 的工作方式,您可以随时创建自己的自定义类:

Public Class MaskedByte

    Private innerValue As Byte
    Private mask As Byte

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal value As Byte, ByVal mask As Byte)
        MyBase.New
        innerValue = value
        Mask = mask
    End Sub

    Public Property Value As Byte
        Get
            Return (innerValue And Mask)
        End Get
        Set
            innerValue = value
        End Set
    End Property

    Public Property Mask As Byte
        Get
            Return mask
        End Get
        Set
            mask = value
        End Set
    End Property

End Class

然后,使用:

Dim myMaskedByte As MaskedByte
myMaskedByte.Mask = &HF0
myMaskedBytef3.Value = someValue

(我不知道VB.NET,但我认为这是正确的)。

【讨论】:

  • +1 用于自定义类的想法,不过我可能会在类上使用结构。
  • 这可能就是我最终要做的。我仍然希望只有一个我忽略的(点)网络类/结构/方法,这样我就不必创建一个。你是对的,翻译你发布的内容并不难。
  • 我决定创建一个类似于 BitArray 的自定义类,但有几个更好的构造函数,以及一些其他有用的位旋转类型的额外方法。这使其成为存储位的“最佳”方式(如问题中所定义)。虽然,我使用整数作为后备值(类似于 BitArray)。
【解决方案3】:

我同意将它们保存在一个字节中,但是不清楚为什么???你想要一个半字节......这个例子将一个字节的两个半字节放入不同的数组中

'Test Data
'create a byte array containing EVERY possible byte value
Dim b(255) As Byte
For x As Integer = 0 To b.Length - 1
    b(x) = CByte(x)
Next

Dim bMS(255) As Byte 'most sig.
Dim bLS(255) As Byte 'least sig.
Const mask As Byte = 15
'
For x As Integer = 0 To b.Length - 1
    bMS(x) = b(x) >> 4
    bLS(x) = b(x) And mask
Next

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2014-11-30
    • 2011-12-16
    • 2017-05-01
    相关资源
    最近更新 更多