在计算 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”索引
你明白了吗?
我正在使用我在 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”索引
你明白了吗?