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
为了识别位掩码值的内容,我需要一个高效的 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