php 实际项目,关于php:位运算在-PHP-实际项目当中的运用

来回顾一下这些基础知识,同时也会讲位运算在 PHP 理论我的项目当中的高级技巧。

一、位运算常识回顾

PHP 手册当中,专门对位运算及位运算符进行了应用介绍。

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

https://www.php.net/manual/zh/language.operators.bitwise.php

1) 按位与运算符:&

之所以称为位运算,指的是在运算过程中,咱们会把两组须要位运算的数值进行二进制化,而后两组二进制的数字从低位向左对齐。这里的位指的是二进制数字的地位。而按位与运算符指的是两组数值每一位相与,同为 1 则 后果为 1,否则为 0。

看 PHP 示例:

echo 1 & 3; // 输入:1

为什么会输入 1 呢?

那是因为:

1 的二进制示意后果为:01。

3 的二进制示意后果为:11。

那么这两组二进制后果对齐之后的运算流程如下:

01

11

——

01

从右往左进行位运算,都 为 1 则后果为1,否则为 0。后果天然是 01。而 01 转换成十进制就是 1 。所以,输入的后果为 1。

再看一组示例吧:

echo 2 & 10; // 输入:2

咱们来看看运算过程:

10

1010

——————

0010

0010 转换成十进制就是 2。

肯定要记得是向左对齐。或者称为低位顺位对齐模式。

如果你不会十进制转二进制或二进制转十进制不会。那么,上面这两个办法能帮忙你。

echo decbin(10); // 十进制转二进制。

echo bindec(10); // 二进制转十进制。

2) 按位或运算符:|

这个跟下面的按位与运算符略微有一点不同:只有两组数字当中有只有有一位是 1 则后果就为 1。

看示例:

echo 2 | 10; // 输入后果:10

运算过程:

10

1010

——————

1010

1010 的十进制后果就是 10。

3) 按位异或运算符:^

这个运算符比拟有意思:两组数字必须是一组 0 与 1 后果才为 1。1 与 1 和 0 与1 都是 0。

看示例:

echo 1 ^ 1; // 输入后果:0

echo 1 ^ 0; // 输入后果:1

1 ^ 1 运算过程:

01

01

——

00

1 ^ 0 运算过程:

01

00

——

01

这个很简略。没啥好说的。反正不雷同就为 1,雷同就为 0。

4) 其余位运算符:~、>>、<<

~ 按位取反运算符、>> 右移运算符、<< 左移运算符。它们的操作数都是一个。所以,与下面的两个操作数的位运算符有着非常明显的区别。在 PHP 理论编程当中,使用比拟少。权当常识理解即可。

二、高级动用技巧

咱们在上面对位运算符的常识进行了回顾。为的就是要在接下来的理论我的项目中怎么使用它解决理论问题。

咱们首先来看一个零碎中常见的需要:

有一个广告表,咱们要对广告做显示管制:

手动高低线。

只容许 VIP 查看。

可能的表构造如下:

CREATE TABLE `finger_ad` (

`ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

`ad_name` varchar(50) NOT NULL COMMENT '广告名称',

`ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',

`ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',

`is_vip` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否仅限 VIP 显示',

`display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0暗藏',

PRIMARY KEY (`ad_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='广告表';

如果前期,咱们需要更改了。须要再减少几种限度:

已登录用户

未登录用户

30 天内未登录用户

注册 30 天的用户

遇到这种限度条件的需要,开发同学是不是很伤脑筋?

可能很多开发第一反馈就是在表构造减少这种新增的限度条件字段。所有看来仿佛很美妙。

确实,这样增加字段是最快最容易的形式。也能实现咱们的需要。

然而,这样会引来如下故障:

每次减少限度条件。咱们都要减少字段。这种对数据库的更动能少改就少改。毕竟,无限度的减少字段不可取。

如果广告表数据量很大。大到减少一个字段须要几分钟的时候,这会给数据库服务器造成读写压力。

条件越多,SQL 条件语句就会越来越长。

那么,还有没有更好的形式解决这些问题呢?

答案:有!

这就是咱们明天要讲的按位与运算符的高级技巧。

咱们把下面的表构造改一下:

DROP TABLE IF EXISTS `finger_ad`;

CREATE TABLE `finger_ad` (

`ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

`ad_name` varchar(50) NOT NULL COMMENT '广告名称',

`ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',

`ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',

`bit_condition` INT(11) UNSIGNED NOT NULL COMMENT '位运算条件:1-登录可拜访、2-未登录可拜访、4-30天注册可拜访、8-30天未登录可拜访、16-未生产可拜访、32-VIP可拜访',

`display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0暗藏',

PRIMARY KEY (`ad_id`)

) ENGINE=InnoDB DEFAULT CHARSET UTF8 COMMENT='广告表';

咱们把所有的条件都去掉了。减少了一个字段: bit_condition 。把所有的条件都组合到一个字段。

那咱们此时该如何写代码呢?

比方,当初要增加如下限度条件的广告:

只容许登录用户拜访或已注册 30 天用户或是 VIP 用户才容许拜访该广告。

那么,这个广告的 bit_condition 该如何设置值呢?很简略,把这几个条件的位值间接相加。此时值为:37。

很多可能会很奇怪。设置为 37 ,我怎么晓得是这几个值的和呢?如果对 Linux 零碎权限相熟的同学就很容易了解这种做法。实际上,这里使用了按位与运算的个性:任意组合相加的值不会反复。

这个了解起来有肯定难度。我三两句也很难给你梳理明确。大家能够在网上深刻开掘一下这方面儿的常识。你只须要晓得这一点特点即可。

那么,当初咱们该如何写 SQL 呢?

示例如下:

SELECT * FROM finger_ad WHERE display = 1 AND bit_condition & 3 = bit_condition

这条 SQL 语句当中的 3 对应的是以后用户针对这么多条件失去的数值。如果 bit_condition位值是与 3 按位与与 bit_condition 后果雷同,阐明条件合乎。

咱们通过一个字段解决了所有条件的问题。着实得感激按位与运算符的个性。同时也对 MySQL能反对位运算符感到开心。

那么,它有什么毛病呢?

想必有教训的同学曾经看进去了。这种写法只能满足蕴含关系。如果要实现同时满足 3 个条件能力拜访就不行了。或者,一个满足另外一个取反。

长处显著,同样毛病也很显著。大家要依据理论状况来选用。

以上内容心愿帮忙到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不晓得该从那里动手去晋升,对此我整顿了一些PHP高级、架构视频材料和大厂PHP面试PDF| 收费获取能够关注公众号:PHP开源社区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值