VBA 以 2 为底增量的 for 循环

VBA for-loop with base 2 increment

为了识别位掩码值的内容,我需要一个高效的 VBA 解决方案来遍历各种可能性(1、2、4、8、.. 跳过中间的任何内容)

现在我唯一的解决办法是遍历整个范围并检查当前迭代是否是基数 2

For i = ErrorType.[_First] To ErrorType.[_Last]
  If isBase2(i) Then
    ...
  End If
Next i

我正在考虑与此 Java 代码片段类似的内容

for(int i = 0; i < x; i = Math.pow(2, i++)) {
  ...
}

但我无法在 VBA 中复制它而不会导致无限循环。

在 java 中,更多地按照 for (int i = 1; i <= x; i <<= 1) 的思路思考。

这样,如果我们尝试将其转换为 vba 并记住 vba 中没有任何变化,我们可以通过将相同的逻辑改造成while 循环与乘法:

Dim i As Integer
i = 1

Do While i <= x
    i = i * 2
Loop

我会记住,pow 仅用于计算 2 的幂就相当昂贵。只需在循环之前将 0 作为单独的情况处理并避免所有比较。 VBA 无论如何都不是最高效的平台,因此通常要保持简单。

Dim pow As Long
Dim i As Long
For pow = -1 To 4 'or however high you want to go
    If pow = -1 Then
         i = 0 ' Special case: 0 isn't a power of 2
    Else
         i = 2 ^ pow
    End If
    Debug.Print i
Next pow