简单的数字模式,将组合存储为唯一总和

时间:2009-12-15 08:41:08

标签: database math unique combinatorics

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

假设我在一个系列中有7个项目。为了这个例子,让我们使用一周中的几天。我希望用户提交他们计划在下一周进入的一周中的哪几天。它们会显示一系列标准复选框,每周一次。

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

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

我还可以给一周中的每一天都有一些奇怪的独特之处,这样任何数字组合都不可能与任何其他组合相同。

我的希望是,不是为第二个场景制作这样的系列,而是已经存在一些数字属性(可能是系列中每个数字的平方等),这些属性已经得到充分利用和尊重。理想情况下,这对编程来说非常熟悉,导出各个数字只需要很少的通用编程语言开销(在我的例子中是PHP)。

我是否只是想到了这个,或者这样的事情存在吗?

3 个答案:

答案 0 :(得分:6)

使用位掩码 - 2的幂。

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

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

Monday | Tuesday = 3 (or 00000011 in binary)

答案 1 :(得分:5)

您可以使用

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

组合将是独一无二的。

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

这给出了C#

中的idee的一个很好的解释

Enum Flags Attribute

答案 2 :(得分:0)

回到内存珍贵的日子里,程序员经常在设置,参数,游戏布局等方面遇到很多麻烦。有些语言甚至内置了位集。

我记得有一次读过有关用于存储电路板布局以解决八皇后问题的位组教程。

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