gpt4 book ai didi

vb.net - 按位运算 - 检查和删除

转载 作者:行者123 更新时间:2023-12-04 23:40:50 26 4
gpt4 key购买 nike

请注意下面的简单示例:

Module Module1
<Flags>
Public Enum Names
None = 0
Test = 1
Test2 = 2
Test3 = 4
Test4 = 8
End Enum

Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module

我的问题的第一部分与行 If (test And Names.Test3) = Names.Test3 有关.

简单地检查 If test And Names.Test3不是更好吗?好像国旗存在一样?如果它评估为非零值(意味着标志存在),则条件的结果将是 True反正。

是否有充分的理由使用第一种方法来检查第二种方法? (虽然我的回答是针对 VB.NET,但我也有兴趣知道这是否是其他任何地方的潜在陷阱,即 C#、C++ 等)。

此外,关于标志移除,似乎有两种方法可以做到这一点:
test = test Xor Names.Test3test = test And Not Names.Test3
但是,第一个将在缺少标志时添加该标志,如果存在则将其删除,而第二个只会将其删除。这是唯一的区别吗?或者还有其他原因为什么我应该更喜欢一种方法而不是另一种方法?

最佳答案

你说你可以有效地替换它是正确的:If (test And Names.Test3) = Names.Test3 Then有了这个If (test And Names.Test3) Then 但是 ,第二个例子将不会与 Option Strict On 一起编译因为你正确地得到了错误:Option Strict On disallows implicit conversions from 'Names' to 'Boolean'所以为了编译它,你需要包装一个 CBool圆它。
因此,总而言之,我会说使用第一个示例要好得多,因为意图非常明确:-您正在检查是否设置了位。
在标志删除方面,即取消设置一点,您应该使用:test = test And Not Names.Test3使用 Xor具有切换值的效果。
以下可能会有所帮助(特别是如果您将它们设为扩展方法):

Public Function SetBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue Or aBit)
End Function

Public Function ClearBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue And Not aBit)
End Function

Public Function IsBitSet(ByVal aValue As Names, ByVal aBit As Names) As Boolean
Return ((aValue And aBit) = aBit)
End Function

Public Function ToggleBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue Xor aBit)
End Function

关于vb.net - 按位运算 - 检查和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com