按位与检查相等性
Bitwise AND To Check Equality
如果您有一个名为 typeToAdjust
的 [Flags]
枚举实例,并且您想查看它是否等于 clientType,这样做有什么意义吗?
(clientType & (int)typeToAdjust) == (int)typeToAdjust
这不也是一样吗?:
clientType == (int)typeToAdjust
是的,但是拥有标志枚举的目的是让您可以将它们组合起来
typeToAdjust = type1
clientType = type1 | type2
(clientType & (int)typeToAdjust) == (int)typeToAdjust // true
clientType == (int)typeToAdjust // false
这两个语句是不同的,但第二个是实际测试相等性的语句。如果 clientType
具有 typeToAdjust
中设置的位的超集,则第一个表达式的计算结果为真,因为 (clientType & (int)typeToAdjust)
仅计算为 typeToAdjust
。通过超集,我的意思是 typetoAdjust
中设置的所有位都在 clientType
中设置,但可能还有一些额外的位。
如果您在 clientType 中设置了多个标志,那么您必须执行第一个,尽管您也可以这样做:
(clientType & (int)typeToAdjust) != 0
您似乎错过了 [Flags]
允许设置一个或多个位的整个想法。
(clientType & (int)typeToAdjust) == (int)typeToAdjust
和
clientType == (int)typeToAdjust
不一样
取 clientType = 3 和 typeToAdjust = 1
clientType & (int)typeToAdjust = 1 = typeToAdjust
但是 clientType != (int)typeToAdjust
如果您有一个名为 typeToAdjust
的 [Flags]
枚举实例,并且您想查看它是否等于 clientType,这样做有什么意义吗?
(clientType & (int)typeToAdjust) == (int)typeToAdjust
这不也是一样吗?:
clientType == (int)typeToAdjust
是的,但是拥有标志枚举的目的是让您可以将它们组合起来
typeToAdjust = type1
clientType = type1 | type2
(clientType & (int)typeToAdjust) == (int)typeToAdjust // true
clientType == (int)typeToAdjust // false
这两个语句是不同的,但第二个是实际测试相等性的语句。如果 clientType
具有 typeToAdjust
中设置的位的超集,则第一个表达式的计算结果为真,因为 (clientType & (int)typeToAdjust)
仅计算为 typeToAdjust
。通过超集,我的意思是 typetoAdjust
中设置的所有位都在 clientType
中设置,但可能还有一些额外的位。
如果您在 clientType 中设置了多个标志,那么您必须执行第一个,尽管您也可以这样做:
(clientType & (int)typeToAdjust) != 0
您似乎错过了 [Flags]
允许设置一个或多个位的整个想法。
(clientType & (int)typeToAdjust) == (int)typeToAdjust
和 clientType == (int)typeToAdjust
不一样
取 clientType = 3 和 typeToAdjust = 1
clientType & (int)typeToAdjust = 1 = typeToAdjust 但是 clientType != (int)typeToAdjust