解码 VB 中的指数公式

Decoding exponential formula in VB

我正在开发一个允许用户在特定时间将自动任务设置为 运行 的程序。

以下是星期选择的示例:

每一天的值都是 2 ^ (x - 1),x 是天数(周日=1,周一=2,周二=3,等等)

然后,代码遍历并计算所有选中框的总和以获得存储在数据库中的单个数值。

例如,如果所有复选框都被选中,则最终值为 1+2+4+8+16+32+64 = 127。

下面是 VB 代码:

If mycheckbox.Checked = True Then
    dowVal = dowVal + 2 ^ (x - 1)
End If

对每个复选框重复此操作,用 x 代替日期编号,用 mycheckbox 代替每一天的唯一复选框 ID。一旦 运行 整整 7 天,dowVal 就是发送到数据库的最终值。

根据复选框生成 dowVal 很简单,但我该如何反转这个过程呢?

给定一个 dowVal,我需要以编程方式选中所有相应的框,并生成与最初用于生成 dowVal 的选中框完全相同的组合。

我最初尝试使用上面 IF 语句的逆函数,如下所示:

 If dowVal = 2 ^ (x - 1) Then
            mycheckbox.Checked = True
 End If

显然这仅在选中单个复选框时有效,因为它不考虑总和值。

我能想到的唯一方法是使用大量 IF 语句来解释所有可能的排列,但这不适用于程序的其他部分使用相同的公式,例如 minute of一天,因为它有 60 个复选框,组合的数量将呈指数增长。

我将如何解码 dowVal 并将其转换回不涉及指数数量的案例的复选框?

我不会给你完整的答案,因为我假设这是作业,但我会给你一个提示。

从后面开始。

如果你的号码是77

从 64 开始。64 适合 77,这意味着您还剩下 13 - 然后继续倒退,直到剩下正确的天数 (64,8,4,1)。

祝你好运

Dim num = 77

for x as integer = {64,32,16,8,4,2,1,}
    if num - x >= 0 then
         select case num
              case 64 : checkbox64.checked = true
              case 32 : checkbox32.checked = true
              'blah blah 
         end select
         num -= x
    end if
next

这看起来很适合 "Flags Enum"。您为一周中的每一天创建一个值为 2 的幂的枚举。然后将编码数据转换为 Enumeration 类型的变量。现在你可以这样做了:

dim days as DaysOfWeek = ctype(value,DaysOfWeek)
if days.HasFlag(DaysOfWeek.Monday) then ...

可以在 MSDN 上找到更多信息。