【问题标题】:And operator with 1 2 4 8 16-like enumaration具有 1 2 4 8 16 类枚举的运算符
【发布时间】:2012-08-26 12:21:15
【问题描述】:

我已经用了很长时间了。现在我想知道它是如何工作的。我有一个例子:

If e.State And DrawItemState.Selected Then
    'if e.state includes DrawItemState.Selected do something
End If

E.state 有 1 2 4 8 16 32 64 128 等选项... e.State 还可以包含多个选项。例如 4 + 32 即 36 包括两个状态。我可以用“and”运算符检查它们。我完全了解用法,但我不知道它是如何工作的。另外我想知道用“Select Case”块检查每个条件是否更有效。

编辑:我现在理解了逻辑。效率怎么样?

【问题讨论】:

  • 看看bitwise operations in VB.NET。这就是您在 And 运算符中使用的内容。
  • 我想知道this SO answer 是否会帮助你。你要问的是一个“标志”枚举。
  • 在问这里之前我已经检查过了。它没有给我答案:(
  • 如果提供的两个链接不能满足您的需求,也许您可​​以澄清或扩展您的问题以帮助我们了解您的需求?
  • 我的答案是 O. R. Mapper。我刚刚检查了你的链接。它告诉如何使用,但不告诉它是如何工作的。

标签: .net vb.net comparison enumeration


【解决方案1】:

这是一个bitwise operation。查看二进制中的数字(1、2、4、8...):1101001000 等。如果添加它们,您会得到例如1010 并“与”他们带来例如

  1010
& 1000
  ====
  1000

由于 False = 0 和 True = 所有非 0 的情况,if 语句有效。

【讨论】:

  • 因此它比较整数的每一位,并且“与”运算符支持 0 到 1。对于一种最高级别的语言来说,这确实很有趣。有效吗?
  • 它不“喜欢”它。它逐位比较两个值,如果两个值在同一位置都有 1,则输出值将在该位置有 1(即 1010 和 1000 = 1000 和 1010 和 0101 = 0000 和 1010 和 0010 = 0010;看对于按位运算:OR、AND、XOR)。而且它通常非常高效,因为它是单处理器操作。
【解决方案2】:

您的代码实际上将逻辑和按位 AND 运算符混为一谈:存在隐式转换,如果您打开 Option Strict On,则会引发编译器错误。只使用位运算符更“正确”,如下:

If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then

你的问题很好。 Visual Basic 的 AND 运算符在这方面有点混乱,相信很多程序员都会有同样的困惑。我当然做到了,早在那天:-)

至于与 SELECT CASE 相比的效率,这取决于您是要自己处理每个标志,还是处理标志的模式。

如果您将 e.State 视为一个灯开关面板,每个开关都可以打开或关闭,这会有所帮助。 SELECT CASE 可用于处理开关模式,但不能用于处理单个开关。

例如

CASE DrawItemState.Selected

仅当 e.State 为 ONLY .Selected 时才会触发。如果 e.State 是 .Selected 加上 .Focus,像这样:

e.State = DrawItemState.Selected Or DrawItemState.Focus

那么 CASE 语句将不会触发。

【讨论】:

  • 所以如果我错了请纠正我。如果 e.State 包含 DrwItemState.Selected,“e.State And DrawItemState.Selected”返回 DrawItemState.Selected?我越来越困惑:(
  • 好的。我手动进行了操作(笔和纸:))。现在一切都清楚了。效率怎么样?
  • 评论已删除 - 我会将其添加到我的答案中
  • 我想我被误解了。我有两个选择。一种是使用标志和这个“与”运算符。其他例如为每个备选方案保留一个布尔值并通过 if 语句检查每个备选方案。那么在这种情况下哪个更有效呢?
  • 这取决于属性是否相互影响。如果您可以在不知道其他属性的状态的情况下处理 .Selected 属性,那么我将使用单独的布尔变量。但是,如果您必须在处理之前考虑所有属性,那么我会使用标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多