设为首页 收藏本站
查看: 701|回复: 0

[经验分享] PHP位域操作函数封装

[复制链接]

尚未签到

发表于 2017-4-4 07:13:12 | 显示全部楼层 |阅读模式
  每次用到了再写, 总觉得在干无用的事情, 这次, 写了一个比较通用的, 备份下来..也分享出来....有缺陷/不足请指正...
  <?php/*+----------------------------------------------------------------------+| 位域运算库函数                                                       |+----------------------------------------------------------------------+| 提供位域运算能力                                                     || 此lib提供的函数基于以下前提                                          ||     1. 所有偏移量都是从右向左计算                                    ||     2. 所有偏移量都从0开始,即0代表最右面的第一位                     |+----------------------------------------------------------------------+| authors: selfimpr <leiguoguo@yahoo.com.cn>                           || blog: http://blog.csdn.net/lgg201                                    |+----------------------------------------------------------------------+*//*** 保留$target中从$offset开始的$limit位, 其余位置0* @param int $target 操作数* @param int $offset 偏移量* @param int $limit 保留总位数* @return int计算结果*/function bit_remain_range(&$target, $offset, $limit) {return $target &= (pow(2, $limit) - 1) << $offset;}/*** 将$target中从$offset开始的$limit位设置为0, 其余位不变* @param int $target 操作数* @param int $offset 偏移量* @param int $limit 清理总位数* @return int计算结果*/function bit_clear_range(&$target, $offset, $limit) {return $target &= ~ ((pow(2, $limit) - 1) << $offset);}/*** 将$target中的第$order位置为0* @param int $target 操作数* @param int $order 要操作的位的偏移量* @return int计算结果*/function bit_clear_single(&$target, $order) {return bit_clear_range($target, $order, 1);}/*** 将$mask中的$offset起的$limit位合并到$target的对应位置* @param int $target 操作数* @param int $mask 要合并的值* @param int $offset 偏移量* @param int $limit 合并总位数* @return int计算结果*/function bit_merge_range(&$target, $mask, $offset, $limit) {bit_remain_range($mask, $offset, $limit);bit_clear_range($target, $offset, $limit);return $target |= $mask;}/*** 将$mask的低$limit位合并到$target的$offset起的$limit位中* @param int $target 操作数* @param int $mask 要合并的值* @param int $offset 偏移量* @param int $limit 合并总位数* @return int计算结果*/function bit_set_range(&$target, $mask, $offset, $limit) {bit_remain_range($mask, 0, $limit);return bit_merge_range($target, $mask << $offset, $offset, $limit);}/*** 设置$target的$order位为1* @param int $target 操作数* @param int $order 要操作的位* @return int计算结果*/function bit_set_single(&$target, $order) {return bit_set_range($target, 1, $order, 1);}/*** 计算$target中从$offset起的$limit位值是否等于$value* @param int $target 操作数* @param int $value 要比较的值* @param int $offset 偏移量* @param int $limit 总位数* @return bool比较结果(相等true)*/function bit_check_range($target, $value, $offset, $limit) {bit_remain_range($target, $offset, $limit);$target >>= $offset;return $target == $value;}/*** 检查$target的第$order位是否为1* @param int $target 操作数* @param int $order 要检查的位* @return bool比较结果(是1返回true)*/function bit_check_single($target, $order) {return (bool)bit_remain_range($target, $order, 1);}
下面是一个简单的单元测试
  <?php/*+----------------------------------------------------------------------+| 位域运算库函数单元测试                                               |+----------------------------------------------------------------------+| 提供位域运算能力                                                     || 此lib提供的函数基于以下前提                                          ||     1. 所有偏移量都是从右向左计算                                    ||     2. 所有偏移量都从0开始,即0代表最右面的第一位                     |+----------------------------------------------------------------------+| authors: selfimpr <leiguoguo@yahoo.com.cn>                           || blog: http://blog.csdn.net/lgg201                                    |+----------------------------------------------------------------------+*/require dirname(__FILE__) . '/bit_lib.php';function test_bit1($method) {$args= func_get_args();$func= $args[0];$target= $args[1];$args= array_slice($args, 1);printf("%s:\n%032b\n%032b\n\n", "$func(" . implode(', ', $args) . ")", $target, call_user_func_array($func, $args));}function test_bit2($method) {$args= func_get_args();$func= $args[0];$target= $args[1];$mask= $args[2];$args= array_slice($args, 1);printf("%s:\n%032b\n%032b\n%032b\n\n", "$func(" . implode(', ', $args) . ")", $target, $mask, call_user_func_array($func, $args));}function test_bit3($method) {$args= func_get_args();$func= $args[0];$target= $args[1];$args= array_slice($args, 1);printf("%s:\n%032b\n%s\n\n", "$func(" . implode(', ', $args) . ")", $target, json_encode(call_user_func_array($func, $args)));}function test_bit4($method) {$args= func_get_args();$func= $args[0];$target= $args[1];$mask= $args[2];$args= array_slice($args, 1);printf("%s:\n%032b\n%032b\n%s\n\n", "$func(" . implode(', ', $args) . ")", $target, $mask, json_encode(call_user_func_array($func, $args)));}#由于bit_lib中函数定义了引用传参, 测试用例为了书写方便没有传递引用, 因此会有警告.error_reporting(E_ALL & ~E_WARNING);test_bit1('bit_remain_range', 0xFFFFFFFF, 4, 8);test_bit1('bit_clear_range', 0xFFFFFFFF, 4, 8);test_bit1('bit_clear_single', 0xFFFFFFFF, 4);test_bit2('bit_merge_range', 0xFF00FF00, 0xFFFFF0FF, 4, 8);test_bit2('bit_set_range', 0xFF00FF00, 0xFFFFF0FF, 4, 16);test_bit1('bit_set_single', 0xFF00FF00, 4);test_bit3('bit_check_single', 0xFF00FF00, 8);test_bit4('bit_check_range', 0xFF00FF00, 0xF0, 4, 8);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359805-1-1.html 上篇帖子: 免费开源PHP商城系统介绍 下篇帖子: PHP this,self 和 parent 关键字
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表