访问VBA IF(X和Y)> 0然后

时间:2016-12-19 23:19:48

标签: vba access-vba

我很难过这个。我在Access中有一些正常运行的VBA代码,看起来像这样。

If (intFrontLoaded And 2) > 0 Then boolFrontLoad(1) = True Else boolFrontLoad(1) = False
If (intFrontLoaded And 4) > 0 Then boolFrontLoad(2) = True Else boolFrontLoad(2) = False
If (intFrontLoaded And 8) > 0 Then boolFrontLoad(3) = True Else boolFrontLoad(3) = False
If (intFrontLoaded And 16) > 0 Then boolFrontLoad(4) = True Else boolFrontLoad(4) = False
If (intFrontLoaded And 32) > 0 Then boolFrontLoad(5) = True Else boolFrontLoad(5) = False
If (intFrontLoaded And 64) > 0 Then boolFrontLoad(6) = True Else boolFrontLoad(6) = False

我正试图找出(intFrontLoaded And X) > 0)的工作原理。

我知道它的作用,我试图弄清楚如何,例如: 如果intFrontLoaded = 14,那么boolFrontLoad(1),(2)和(3)将为true。 如果intFrontLoaded = 28,那么boolFrontLoad(2),(3)和(4)将为真。

我知道2 + 4 + 8 = 12和4 + 8 + 16 = 28,但(intFrontLoaded And X) > 0)如何进行计算?

3 个答案:

答案 0 :(得分:3)

在此上下文中,

Andbitwise AND运算符。测试是检查单个标志位。让我们使用intFrontLoaded = 14If (intFrontLoaded And 4) > 0 Then的示例。

14 as bitflags is this: 0000 0000 0000 1110
4 is this:              0000 0000 0000 0010

And的结果是相同的。在上面的例子中,它只是“flag”位,4。因此,And操作的结果是4。

现在将其插回到表达式中:

If 4 > 0 Then

因此,它执行“真实”条件。如果您注意到,所有测试都是2的幂。这是因为当它们表示为二进制时,它们只是一个位。

基本上,intFrontLoaded为每个被测试的位存储一个布尔值。这在早期计算中更为常见,当内存非常宝贵并且使用所有16​​位来存储布尔值时,这被认为是浪费。

请注意,您可以将其简化为:

boolFrontLoad(1) = intFrontLoaded And 2
boolFrontLoad(2) = intFrontLoaded And 4
boolFrontLoad(3) = intFrontLoaded And 8
boolFrontLoad(4) = intFrontLoaded And 16
boolFrontLoad(5) = intFrontLoaded And 32
boolFrontLoad(6) = intFrontLoaded And 64

答案 1 :(得分:2)

And运算符是按位AND运算 - 它比较每个操作数中的位,并返回两个操作数共有位的值。

那就是说,你的代码将更清晰地写成:

boolFrontLoad(1) = (intFrontLoaded And 2) > 0
boolFrontLoad(2) = (intFrontLoaded And 4) > 0
boolFrontLoad(3) = (intFrontLoaded And 8) > 0
boolFrontLoad(4) = (intFrontLoaded And 16) > 0
boolFrontLoad(5) = (intFrontLoaded And 32) > 0
boolFrontLoad(6) = (intFrontLoaded And 64) > 0

答案 2 :(得分:1)

这称为bitwise操作。逻辑AndintFrontLoaded And X之间的每位执行。当X是2的幂时,比如2^a,其二进制表示由零组成,除了(a + 1)'位置上的1(从右到左编号位)

因此,intFrontLoaded And 4检查intFrontLoaded中的第三位是否已设置。如果结果不为零,则IF将成功。

在代码中intFrontLoaded用作位集,即一组标志,其中每个位代表一些布尔条件的标志。