没有循环的整数到布尔/位数组

Gre*_*edo 5 arrays excel vba excel-vba

我有一个数字(比如5),我首先要将其转换为二进制(101),然后在VBA中拆分成一个位数组{1,0,1}或布尔值{True,False,True}

有没有办法在没有循环的情况下做到这一点?

我可以转换为二进制文件而无需使用工作表公式在我的代码中循环,如下所示

myBinaryNum = [DEC2BIN(myDecInteger,[places])]
Run Code Online (Sandbox Code Playgroud)

但是我被告知工作表功能非常低效,而且这个功能特别有限.

我不知道如何在没有循环数字的情况下拆分成数组MID.有没有像strConv数字一样的东西?

Flo*_* B. 5

您可以先将值转换为"01"字符串WorksheetFunction.Dec2Bin.然后用代码替换每个"0","1" 01将结果转换为Byte数组:

Public Function ToBitArray(ByVal value As Long) As Byte()
  Dim str As String
  str = WorksheetFunction.Dec2Bin(value)                   ' "101"
  str = Replace(Replace(str, "0", ChrW(0)), "1", ChrW(1))  ' "\u0001\u0000\u0001"
  ToBitArray = StrConv(str, vbFromUnicode)                 ' [1, 0, 1]
End Function
Run Code Online (Sandbox Code Playgroud)

Dec2Bin仅限于511,使用字符串相当昂贵.因此,如果您的目标是获得最佳性能,那么您应该使用循环来读取每个位:

Public Function ToBitArray(ByVal value As Long) As Byte()
  Dim arr(0 To 31) As Byte, i As Long
  i = 32&

  Do While value
    i = i - 1
    arr(i) = value And 1
    value = value \ 2
  Loop

  ToBitArray = MidB(arr, i + 1)   ' trim leading zeros
End Function
Run Code Online (Sandbox Code Playgroud)