【问题标题】:Simple number pattern to store combinations as a unique sum将组合存储为唯一总和的简单数字模式
【发布时间】:2009-12-15 08:41:08
【问题描述】:

这是一道数学题,但我确信在某些编程场景中肯定会出现这种情况,至少我希望如此,我想知道这种情况是否有名称:

假设我在一个系列中有 7 个项目。为了这个例子,让我们使用星期几。我希望用户提交他们计划在下周到达的一周中的哪几天。它们带有一系列标准复选框,一周中的每一天都有一个。

我想将他们在一个数据库字段中选择的日期存储为单个整数。

显然,我可以为每一天分配一个 1 到 7 的数字(如果用户未选中所有选项,则保留 0)。但是,如果一个用户选择星期一和星期二(1 + 2)而另一个用户选择星期三(3),我就会遇到问题。

我还可以为一周中的每一天赋予一些奇异的独特性,这样任何数字组合都不可能与任何其他组合相同。

我的希望是,与其为第二种情况编造这样的系列,不如已经存在一些已经被广泛使用和尊重的数字属性(可能是系列中每个数字的平方等)。理想情况下,这对于编程来说是非常熟悉的,派生单个数字只需很少的通用编程语言(在我的例子中是 PHP)的开销。

这是我梦寐以求的,还是有这样的事情存在?

【问题讨论】:

    标签: database math unique combinatorics


    【解决方案1】:

    使用位掩码 - 2 的幂。

    Monday = 2 ^ 0 = 1
    Tuesday = 2 ^ 1 = 2
    

    等等。然后星期一和星期二变成:

    Monday | Tuesday = 3 (or 00000011 in binary)
    

    【讨论】:

    • 哦,我明白了!这不仅避免了重叠(这从 astander 的回答中是有意义的),而且用二进制表示整数实际上可以为一周中的每一天提供一个开/关。哇,也许我应该去上课什么的。谢谢!
    【解决方案2】:

    你可以使用

    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    Saturday = 32
    Sunday = 64
    

    组合将是唯一的。

    然后星期一和星期二 = 3,星期三 = 4。

    这很好地解释了 C# 中的思想

    Enum Flags Attribute

    【讨论】:

      【解决方案3】:

      在内存很宝贵的时代,程序员经常费力地将设置、参数、游戏布局等编码为位集。有些语言甚至内置了位集。

      我记得曾经读过一个关于位集的教程,该教程使用它们来存储板布局以解决八皇后问题。

      大多数 C 程序员都有自己的小型位操作宏库来解决这类问题。例如,请参阅Bit Sets。它们仍然在直接进行硬件操作的代码中大量使用——例如在数字 I/O 中打开和关闭位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多