在计算 return 值时使用按位或运算符

Use of bitwise OR operator in calculating a return value

我正在使用我在 AllenBrowne.com 找到的一些代码,它工作正常,但我对它的作用有疑问。

该代码旨在 return 有关在 MS Access table 的特定列上找到的任何索引的信息。索引类型用一个常量标识,有四种可能的索引类型(包括None):

Private Const intcIndexNone As Integer = 0
Private Const intcIndexGeneral As Integer = 1
Private Const intcIndexUnique As Integer = 3
Private Const intcIndexPrimary As Integer = 7

相关代码如下:

Private Function IndexOnField(tdf As DAO.TableDef, fld As DAO.Field) As Integer

    'Purpose:   Indicate if there is a single-field index on this field in this table.
    'Return:    The constant indicating the strongest type.
    
    
    
    Dim ind As DAO.Index
    Dim intReturn As Integer
    
    intReturn = intcIndexNone
    
    For Each ind In tdf.Indexes
        If ind.Fields.Count = 1 Then
            If ind.Fields(0).Name = fld.Name Then
                If ind.Primary Then
                    intReturn = (intReturn Or intcIndexPrimary)
                ElseIf ind.Unique Then
                    intReturn = (intReturn Or intcIndexUnique)
                Else
                    intReturn = (intReturn Or intcIndexGeneral)
                End If
            End If
        End If
    Next
    
    'Clean up
    Set ind = Nothing
    IndexOnField = intReturn

End Function

老实说,我并没有真正理解按位或运算符的概念,所以我花了最后几个小时研究它,所以现在我想我明白了。一路上,我注意到四个可能的索引值等同于一个清晰的二进制模式:

None:    0
General: 1
Unique: 11
Primay: 111

一切都很好。但我不明白 OR 运算符在函数中的用法,在行中:

 If ind.Primary Then
     intReturn = (intReturn Or intcIndexPrimary)
 ElseIf ind.Unique Then
     intReturn = (intReturn Or intcIndexUnique)
 Else
     intReturn = (intReturn Or intcIndexGeneral)
 End If

鉴于此代码的结构意味着只能 returned 一条路径,为什么不直接 return 实际需要的常量,而不使用 OR?我知道 Allen Browne 的代码总是精心设计的,所以我认为他不会无缘无故地这样做,但我看不出它是什么。

有人可以帮忙,让我能更好地理解 - 并在将来自己编写更好的代码吗?

谢谢

按位或在值的组合可以存在的情况下很有用,并且您想要 return 一个附加值。在此特定代码块中,代码循环遍历每个索引,并根据特定索引设置标志。如果有两个索引,其中一个是通用索引,另一个是主要索引,则可以将此信息编码为结果位模式。

不过,我对位图的选择感到困惑。通过选择所有位都设置为 true 的值,您会丢失有关单个项目的信息(也许这是设计元素)。

通常,位图可能类似于:

Option A = 2 --> 0010
Option B = 4 --> 0100
Option C = 8 --> 1000

如果您希望选项 A 和选项 B 都为真,则 BIT OR 将为 return 6,即 0110。 现在,如果您需要测试选项 A 是否为真,您可以使用 BIT AND 运算。如果您测试 (6 BIT AND 2) 它将 return 一个大于 0 的值。但是,如果您测试 (8 BIT AND 6),这是选项 c 的值,它将 return a 0.

希望这能增加一些清晰度。我没有太多关于 Access 具体如何处理索引的信息,所以我只是在谈论一般情况。


编辑:所以我重新阅读了函数定义,似乎整数的选择是有意的。该函数有意 return 是最强的索引类型。所以,如果有主索引,它只会显示一个主索引。考虑到这一点,我不确定按位 or 是这里最具自我描述性的选项。也许还有其他考虑因素。

正如 basodre 指出的那样,按位是正确的,但 2、4、8 的基础不是。

处理索引时,所有的可能性都是可能的,因此是 1、3、7(最右边的 3 位)。

0000 = No index
0001 = regular index
0011 = unique index
0111 = PRIMARY index

因此,IF 块正在使用索引类型的最高限定符进行测试。

任何索引都可以正则,没问题。

一些索引可以是唯一的,它们可以在某种连接字段上以希望与 table

的主键无关

最后一个是 table 的主键 - 这也是唯一的。

因此,如果您要测试的索引是主索引,那么如果您询问它是否是索引,甚至是唯一索引,它也会显示为真。

所以,它正在做的是启动

 intReturn = intcIndexNone

实质上将 return 值设置为默认值 0。然后循环遍历 table 中所有将给定字段作为索引一部分的索引。 table 上可能有 20 个索引,其中 5 个索引使用相关字段。该字段可用作常规、唯一或主键索引的任何可能部分。
所以循环从 NONE (0) 开始。然后在每次发现该字段与索引相关联时进行检查。然后无论当前索引是什么类型的索引,都对结果进行或运算。

所以可以说,索引组件在它经过时首先将给定字段显示为唯一,然后是常规字段,然后是主要字段,只是为了让笑容看到每个循环的 OR 结果。

def intReturn     0000
   OR Unique      0011
                  ====
                  0011  NEW value moving forward


    intReturn     0011
   OR Regular     0001
                  ====
                  0011  Since unique was higher classification, no change


    intReturn     0011
   OR Primary     0111
                  ====
                  0111 Just upgraded to the highest classification index

所以现在,它 return 对先前值的 OR 结果进行运算。在这种情况下,最高索引关联是“Primary”索引

你明白了吗?