如何用一个值来保存多种情况?

广告位招租
扫码页面底部二维码联系

例如,某个房间可从[灯,床,桌,椅,杯子【作者:唐霜】原创内容,盗版必究。,饮水机……]这些器具中挑选,从而组成这未经授权,禁止复制转载。【版权所有,侵权必究】个房间的装潢。我们可能会设计一个房间表,【本文首发于唐霜的博客】原创内容,盗版必究。再设计一个器具表,再设计一个关系表,通过转载请注明出处:www.tangshuang.net【版权所有,侵权必究】这个关系表来保存它们之间的映射关系。但是【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。这样的效率明显是比较差的,需要同时查询三【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】张表才能完成。

【原创不易,请尊重版权】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

我们提供一种通过一个值来计算即可获得这一【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。器具组合的结果,方法如下:

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【原创不易,请尊重版权】
array(
  '1' => '灯'
  '2' => '床',
  '4' => '桌',
  '8' => '椅子',
  '16' => '饮水机',
  ……
)

如果我们将5保存到数据库中,我们可以立马转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net知道,这个房间有“灯”和“桌”,而如果保著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net存的是23,则一定有“灯”“床”“桌”和【原创内容,转载请注明出处】【本文受版权保护】“饮水机”。

原创内容,盗版必究。【作者:唐霜】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

给每一个器具一个给定的值,这个值一定是2本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。的n次方(n>=0),这样就可以保【作者:唐霜】【关注微信公众号:wwwtangshuangnet】证相加之后的值可以反解。这个情况的核心原著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。理在于,给定任何数值的前面数值相加和,一转载请注明出处:www.tangshuang.net原创内容,盗版必究。定小于当前数值。如何进行反解呢?

【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】本文版权归作者所有,未经授权不得转载。

例如我们拿到一个值为N,那么我们可以首先本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。找到最大的2n本文作者:唐霜,转载请注明出处。,确定2【版权所有】唐霜 www.tangshuang.netn【原创内容,转载请注明出处】是一定有的,如果没有2本文作者:唐霜,转载请注明出处。n【转载请注明来源】,就不可能相加得到N。本文作者:唐霜,转载请注明出处。

【版权所有,侵权必究】【本文受版权保护】本文版权归作者所有,未经授权不得转载。

接下来我们获得M = N –【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】 2n【版权所有】唐霜 www.tangshuang.net,找到最大的2【转载请注明来源】m【关注微信公众号:wwwtangshuangnet】,再进行M – 2【本文首发于唐霜的博客】m本文版权归作者所有,未经授权不得转载。,如此推论下去,直到减完为止。原创内容,盗版必究。

【原创不易,请尊重版权】【本文首发于唐霜的博客】【未经授权禁止转载】【本文首发于唐霜的博客】【原创不易,请尊重版权】

那么怎获得最大的2【转载请注明来源】n【版权所有】唐霜 www.tangshuang.net呢?【原创内容,转载请注明出处】

【关注微信公众号:wwwtangshuangnet】【转载请注明来源】【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。
$n = (int)log(N,2);

log函数在PHP4+之后内置,用于取对【转载请注明来源】【版权所有,侵权必究】数,返回值为float类型,但我们仅需要原创内容,盗版必究。本文作者:唐霜,转载请注明出处。整数部分,因此前面加(int)。

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net

例如N=22,那么$n=4,再去计算2^本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。4,就是16。

【本文首发于唐霜的博客】【原创不易,请尊重版权】【版权所有,侵权必究】

通过这个方法,我们可以非常顺利的在一个数本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。据表中用一个值保存多种情况。但是,这也有【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。一定的适用范围,比如这些情况最好是固定不转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】变的,2n【版权所有,侵权必究】值不能太大等等。通过这种方法可以用该值进著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】行权重设计,进行排序,但是不能用于条件检【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。索,比如你想检索数据库中包含“床”的房间【转载请注明来源】【版权所有,侵权必究】,你就不好进行检索,因为大部分房间的该值【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】可能都大于2. 所以,在使用这种方法时,著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。应该根据实际需要进行考虑。

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

更新:【本文首发于唐霜的博客】

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【转载请注明来源】

在数据库中,我们可以使用一种序列化的类二【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】进制字符串来保存多个值,当这个二进制值是未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net以01组成时,实际上就可以换算成为一个十本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】进制数,从而也就实现了一个十进制值保存多著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】种情况的目的。

【本文受版权保护】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net

下面我们来做一个演示。【原创不易,请尊重版权】

【本文首发于唐霜的博客】【原创内容,转载请注明出处】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

例如我们在订票系统中,规定某一个活动每天【原创内容,转载请注明出处】【未经授权禁止转载】分为6个场次,每个场次2个小时,因此实际原创内容,盗版必究。【本文受版权保护】上就把一天的12个小时分为了6份,分别是9:00-11:00,11:00-13:00,13:00-15:00,15:00-17:00,17:00-19:00:19:00-21:00,我们用“xxxxxx”(x取0或1)来转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】表示,现在,我们要记录这些场次是否全部被【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。定完了,用1表示全部被订完,所以“010【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】110”就表示11:00-13:00,1【原创内容,转载请注明出处】【作者:唐霜】5:00-17:00,17:00-19:本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。00这三个场次已经被订完了,不能再对外售【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。票。

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】

我们在数据库中怎么保存呢?【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】

php提供了将二进制转换为十进制的函数b【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】indec(),我们先将二进制值转换为十【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。进制值后,再保存到数据库中。而当我们要使原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】用时,从数据库中取出十进制值,再使用de【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netcbin()将值转换为二进制值,当然,我【版权所有,侵权必究】未经授权,禁止复制转载。们要补全最后得到的二进制值的位数,也就是原创内容,盗版必究。【作者:唐霜】前面加0,然后再进行字符串数组处理,进行著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。对比。

【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【原创内容,转载请注明出处】

在编程世界中,还有一个比较好玩的算法,叫本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net“按位异或”。按位,就是以二进制的形式进【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。行计算,“按位异或”就是两个位的值不同时未经授权,禁止复制转载。【本文受版权保护】返回1,否则返回0。通过这个运算,我们可【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】以得到看上去非常复杂的结果。在php中,【本文受版权保护】本文版权归作者所有,未经授权不得转载。运算为“^”。下面我们来进行一下演算。

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】
001011 ^ 011010 = 010001 (1式,注意,开头的0会被忽略,因此不要把开头的0也算进来)

提按位异或有什么意义呢?因为二进制值可以【版权所有,侵权必究】未经授权,禁止复制转载。和十进制值进行转换,因此我们将二进制值转原创内容,盗版必究。本文作者:唐霜,转载请注明出处。换为十进制值进行按位异或之后,得到的值也【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】是十进制的,我们只有将这些十进制数转换为【转载请注明来源】著作权归作者所有,禁止商业用途转载。二进制字串后,才能发现规律,但是如果我们转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】直接用十进制进行计算,却能快速得到结果。

【本文受版权保护】【作者:唐霜】未经授权,禁止复制转载。【转载请注明来源】

下面我们就来演算一次,我们拿(1式)来看【本文受版权保护】原创内容,盗版必究。。如果将二进制数转换为十进制,我们就能得【本文受版权保护】【转载请注明来源】

【本文受版权保护】转载请注明出处:www.tangshuang.net【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
11 ^ 26 = 17

那事实的结果是不是这样呢?你可以在你的p著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。hp程序中写上:

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】
<?php
echo 11 ^ 26;

是的,结果就是这样。可是,这个复杂的运算【版权所有,侵权必究】【本文受版权保护】有什么用呢?它可以用于比较。比如我们的数【原创内容,转载请注明出处】【版权所有,侵权必究】据库中存放了11,转换为二进制就是“00【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。1011”,也就是表示这一天的场次中,对本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。应的那三个时段已经满票了。但是如果我们现【未经授权禁止转载】【作者:唐霜】在正好要进行对比,看看这一天中17:00【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。-19:00这个时段是否满票,我们怎么能【转载请注明来源】【本文受版权保护】准确知道11这个值转换为001011后,本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。第5个位上的值是否为1呢?

未经授权,禁止复制转载。【原创不易,请尊重版权】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

我们只需要用这种思路来解决即可:未经授权,禁止复制转载。

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创内容,转载请注明出处】
xxxxxx ^ 000010 = ?

其中xxxxxx是我们要对比的值,比如当【本文受版权保护】【版权所有】唐霜 www.tangshuang.net它等于11时,也就是001011时,等式著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。的右边会得到001001(9)。我们再来转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。看另一个算式:

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】
xxxxxx ^ 000000 = ?

等式右边会得到本身。本文版权归作者所有,未经授权不得转载。

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【作者:唐霜】

如果我们再用001001(9)去按位异或【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net000010,则会得到001011(11转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。)。

本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】

我们得到的结论就是,本文版权归作者所有,未经授权不得转载。凡是用xxxxx去按位异或yyyyyy(著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。其中只有一个y为1,其他全为0),得到的【版权所有,侵权必究】未经授权,禁止复制转载。结果比自身小的,则对应位置上的值为1;得【转载请注明来源】【未经授权禁止转载】到的结果比自身大的,对应的位置上为0。通过这种方法,也就找到了哪个时间段是被著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net订满票的。

【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文受版权保护】【版权所有,侵权必究】【本文首发于唐霜的博客】

为什么大于自身的,对应的位置上就一定为0转载请注明出处:www.tangshuang.net原创内容,盗版必究。呢?因为0^1=1,而二进制数是01构成【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net的,也就是说0和1碰上0时,都不会变化,【未经授权禁止转载】【作者:唐霜】而只有0碰上1时才会变化。说白了,用任何【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】一个二进制数去按位异或000100,结果【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。发生的情况就两种,一种是第四个位置上的值【转载请注明来源】【版权所有,侵权必究】由1变为0(结果值相对于本身值而言),这本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】种情况下该值变小,一种是第四个位置上的值【原创内容,转载请注明出处】【本文首发于唐霜的博客】由0变为1,这种情况下该值变大。

【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【版权所有,侵权必究】

了解了这个原理之后,我们只需要在数据库中【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。保存二进制转换而来的十进制值,在查询时,原创内容,盗版必究。【作者:唐霜】用对比值(二进制转换而来的十进制值)去按【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。位异或一下,即可得到我们想要的结果。例如【本文受版权保护】著作权归作者所有,禁止商业用途转载。

【转载请注明来源】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net
SELECT COUNT(id) FROM table WHERE id=8 AND day='2015-08-20' AND (hours ^ 2)<hours;

这样就可以判断出8月20号这天17:00【作者:唐霜】转载请注明出处:www.tangshuang.net-19:00这个时间段是否被订满(如果返【作者:唐霜】著作权归作者所有,禁止商业用途转载。回1,则表示被订满了)。

【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

如果我们不满意用大小比较来进行判断,我们【本文受版权保护】【作者:唐霜】还可以深入发现,按位异或结果与原值之间的【关注微信公众号:wwwtangshuangnet】【作者:唐霜】差值,正好是用来异或的值,也就是满足下面【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】的等式:

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
|m ^ n - m| = n (n为yyyyyy,只有一个y为1,其他为0)

|x|是指绝对值,当不取绝对值,得到的为【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net负数时,说明结果变小了,那么原值对应的位【作者:唐霜】【作者:唐霜】置上也就是1,而如果得到的为正数,说明结【原创不易,请尊重版权】未经授权,禁止复制转载。果变大,对应的位置上就为0。所以,上述s未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。ql,我们还可以这样去改:

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【本文受版权保护】
SELECT id FROM table WHERE id=8 AND day='2015-08-20' AND (hours ^ 2 + 2)=hours;

如果查到了结果,说明id为8的这条记录8【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。月20号这天17:00-19:00这个时【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net间段被订满。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】原创内容,盗版必究。

这种魔术般的使用方法,你是否思考过呢?【访问 www.tangshuang.net 获取更多精彩内容】

【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。

再议【版权所有,侵权必究】

【作者:唐霜】【作者:唐霜】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。

实际上,一个二进制数,我们将它转换为十进【版权所有,侵权必究】【作者:唐霜】制时,将它的各个位置值(从右往左,以0为本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】开始)作为次数求2的次幂,再乘以该位置上【作者:唐霜】【转载请注明来源】的数,再相加,即得到该二进制数对应的十进【未经授权禁止转载】【本文首发于唐霜的博客】制数,例如:

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】
10100 = 0(2^0) + 0(2^1) + 1(2^3) + 0(2^4) + 1*(2^5) = 8 + 32 = 40

这样去观察,就发现实际上8和32,就是我原创内容,盗版必究。【本文受版权保护】们第一次接触这种算法时,将它们作为一个数【本文首发于唐霜的博客】【本文首发于唐霜的博客】组的索引值,进行物品的索引进行计算。

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】

2015-07-06 3806

为价值买单,打赏一杯咖啡

本文价值38.06RMB