+ -
当前位置:首页 → 问答吧 → 共享一个函数 将任意数字分解成2的次方组成的和

共享一个函数 将任意数字分解成2的次方组成的和

时间:2009-06-15

来源:互联网

本帖最后由 luzhou 于 2009-6-15 19:42 编辑

用途:主要用途在数据存储上,比如discuz的一个帖子 精华时 标记为1  置顶时 标记为2  那么既是精华又置顶就是3了。
这样大家就能联系到了吧,用这种方式来描述一个对象的属性值,会很明晰。

举例99999这个数字 可以用下面这个数字的值的和组成。这个表达式中不可以出现重复的数字。
array (
  0 => 65536,
  1 => 32768,
  2 => 1024,
  3 => 512,
  4 => 128,
  5 => 16,
  6 => 8,
  7 => 4,
  8 => 2,
  9 => 1,
)
上代码
[php]
function isAttrValue($val,$arr = array()){
        if($val == 1){
                $arr[] = 1;
                return $arr;
        }
        else{
                for($i=0;;$i++){
                        if($val<=pow(2,$i+1)&&$val>=pow(2,$i)){
                                break;
                        }                        
                }
                if($val == pow(2,$i+1)){
                        $arr[] = $val;
                        return $arr;
                }
                else{
                        $arr[] = pow(2,$i);
                        return isAttrValue($val - pow(2,$i),$arr);
                }
        }
}
[/php]

作者: ws00377531   发布时间: 2009-06-15

好像很牛B样

只是还 是不是很理解,这样分解和你举的这个例子的联系:[code]用途:主要用途在数据存储上,比如discuz的一个帖子 精华时 标记为1  置顶时 标记为2  那么既是精华又置顶就是3了。[/code]能再举个用途的例子吗

作者: Alog_W   发布时间: 2009-06-16

我为什么要做这个东西呢?
以cms系统举例。 一篇文章可以设置很多属性

比如 置顶,精华,热点,最新,A区显示,B区显示,C区显示,标红,标绿,加粗,斜体,h1,h2,h3,h4。

有的时候我们的做法是,在数据库里面加一个字段。 比如 is_hot(0,1) 是否热点 。但是这么多属性,在数据库里面是否要添加这么多字段呢,如果我想再添加属性呢?
事情是不是变的很麻烦了。
采用这种函数对属性去编码,可以快速解决。
举例。[code]
array(
"置顶" => 1,
"精华" => 2,
"热点" => 4,
"最新" => 8,
"A区显示" => 16,
"B区显示" => 32,
"C区显示" => 64,
)
[/code]当一篇文章被标记属性为113的时候。使用函数解析为[code]
array (
  0 => 64,
  1 => 32,
  2 => 16,
  3 => 1,
)
[/code]那么我们是不是可以清楚的知道 这篇文章的属性是“C区显示,B区显示,A区显示,置顶”

作者: ws00377531   发布时间: 2009-06-16

至于 添加一个新的属性,也很简单,最大数*2
检查一个属性值是否有异常,也很简单 看看是否超过 最大数*2

删除一个属性,会比较麻烦。我的想法是,再做一个校验数组,这个数组里面的值,不可再被使用。

作者: ws00377531   发布时间: 2009-06-16

本帖最后由 飓飞 于 2009-6-16 19:46 编辑

代码可以优化一下,呵呵。[code]
function isAttrValue($value){
        $i = 0;
        while ($value > 0) {
                $bit =  $value & 1;
                $bit && ($bits[] = pow(2,$i));
                $value = intval($value / 2);
                $i++;
        }
        return $bits;
}
[/code]

作者: 飓飞   发布时间: 2009-06-16

顶下

作者: niceup   发布时间: 2009-06-16

属性叠加  完整版本在这里
http://bbs.phpchina.com/viewthre ... p;extra=#pid1073701
我重写过了,谢谢大家!

作者: ws00377531   发布时间: 2009-06-17

很强大的说

作者: nianjin   发布时间: 2009-06-28

感觉这种技巧用在属性叠加上意义不大,而且会给拆分查询处理带来许多麻烦,适合用在用户多权限分配验证上

作者: 网鬼   发布时间: 2009-06-29

置顶,精华,热点,最新,A区显示,B区显示,C区显示,标红,标绿,加粗,斜体,h1,h2,h3,h4。
这些都是列表及搜索的关键字段..  全部放在一个字段中, 显然是对性能作挑战..

     楼主的函数适合写在权限中.

作者: 冯.于安   发布时间: 2009-06-29

MYSQL的位运算也容易做到嘛。

作者: 九龙   发布时间: 2009-08-07