我们之前学过逻辑与(&&)      条件1 && 条件2 当两边条件同时成立时候返回1

逻辑或(||)         条件1 || 条件2    当两边条件只要有一个成立时候返回1

一. & 按位与

只有对应的两个二进制位均为1时候,结果位才会是1,否则为0.

举例: 比如9&5,其实就是1001&101 = 1,因此9&5=1

   计算过程

1001
0101
---------
0001

  php代码

echo  9&5;   //1

  

二.  |   按位或

只要对应的两个二进制位有一个为1时,结果位就位1,否则为0。

举例: 比如9|5,其实就是1001 | 101 = 1,因此9|5=13;

1001
0101
---------
1101

  

三. ^ 按位异或 

对应二进制位相异(不相同)时,结果位1,否则为0.

    举例: 比如9^5,其实就是1001^ 101 = 1,因此9^5=12
1001
0101
---------
1100

  

echo  9^5;  // 12

如果自己异或自己呢

1001
1001
---------
0000

就是0

那用自己在异或0

1001
0000
---------
1001

得到的还是自己。

根据上面分析得到如下规律

相同整数^的结果是0,比如5^5=0

多个整数相^的结果跟顺序无关,比如5^6^7 = 5^7^6

任何数值跟0进行异或,结果还是等于原来的数值,比如 9^6^9 = 9^9^6 = 0^6 = 6

应用:

根据上面原理,加密算法中,可以使用使用异或运算符进行加密与解密,在二进制运算中,如果将一个明文的二进制位与密钥进行按位“异或”运算,将得到密文,将此密文与密钥再次进行按位“异或”运算,又可以得到明文。这样,只需编写一个函数便可以同时完成加密和解密两种运算。

四. ~ 按位取反

 把每个二进制位取反,它是单目运算符,只操作一个数。

举例: ~9  把9每个二进制位取反。

~0000 0000 0000 0000     0000 0000 0000  1001
1111 1111 1111 1111 1111 1111 1111 0110 开头第一个数是符号位 这里得出为负数

 

echo  ~9;   // -10

五. << 位运算左移  

把整数的各个二进制位全部左移n位,高位要放弃,低位补0,左移n位其实就是乘以2的n次方。

由于左移位是丢弃最高位,0补最低位,所以符号位也要丢弃,左移后的结果可能会改变正负性

举例:  <<9

下面用0做参考

  0000 0000 0000 0000 0000 0000 0000 0000
000 0000 0000 0000 0000 0000 0000 1001

  

将9左移一位,最高位也就是红色的0出来,然后被舍弃,低位补0如下

0000 0000 0000 0000 0000 0000 0000 0000
000 0000 0000 0000 0000 0000 0000 1000

计算出9左移一位后的值是

echo  9<<1;  //18

在计算下

echo  9<<2;  //36       相当于 9*4=18      在相当于  9*2的2次方
echo 9<<3; //72 相当于 9*6=72 在相当于 9*2的3次方
echo 9<<4; //144 相当于 9*16=144 在相当于 9*2的4次方

得出规律

9 << n  = 9*2的n次方

所以可以引申计算的时候,比如 9*6 就是等于  9<<3,而且位运算比较快。

注意一点,最高位如果是1倍丢弃,后面那一位是0,所以会影响正负性的。

六. >> 位运算右移 

把整数的各个二进制位全部右移n位,保持符号位不变,右移n位其实就是除以2的n次方。

为正数时,符号位为0,最高位补0。

为负数时,符号位为1,最高位是补0或者补1,这取决于编译系统的规定。

举例:  把9右移一位,如下,由于保持符号位不变,左边第二个是空,右边第一个被移出来

   0000 0000 0000 0000 0000 0000 0000 0000
00 0000 0000 0000 0000 0000 0000 1001

然后空出来的用符号位补齐,这里符号位是0,所以就用0补齐,如下

 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 100
echo  9>>1;  //4
echo 8>>1; //4 8右移一位也等于4

右移和左移也有规律

echo  8>>1;  //
echo 8>>2; //
echo 8>>3; //1  

得出

8>>n   等于8/2的n次方

七,利用位操作来实现变量值的互换
我们一般交换两个变量的值都是利用一个临时变量来存储中间的值

$a = 10;
$b =12;
$temp = $a;
$a = $b;
$b = $temp;
echo sprintf("a=%d,b=%d",$a,$b);//a=12,b=10  

或者

$a = $b - $a;
$b = $b - $a;
$a = $b + $a;
echo sprintf("a=%d,b=%d",$a,$b);//a=12,b=10

位运算   利用异或^的规则  a^b^a == a^a^b == b

$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo sprintf("a=%d,b=%d",$a,$b);//a=12,b=10

结果也是一样的

八.利用位运算判断奇偶性

一般用取模的方法来判断是否是奇偶数
比如:
10%2 == 0 那么就是偶数 否则是奇数

根据查看 二进制中 最后一位如果是1那么就是奇数 ,如果是0那么就是偶数。如下:
         15 的而二进制数 : 0000 1111

9  的而二进制数 : 0000 1001

14 的而二进制数 : 0000 1110

10 的而二进制数 : 0000 1010

位于运算,只有当对应的二进制数都是1的时候才是1,否则为0

$a & 1 == 1 //奇数

$a & 1 == 0 //偶数

 

运算符号
意义
运算对象类型
运算结果类型
实例
~
非运算
整型,字符型
整型
~a
&
与运算
a & b
|
或运算
a | b
^
异或运算
a ^ b
<<
位左移运算
a<<4
>>
位右移运算
a>>2

  

使用位运算案例:

1.两数字求和

//两数字相加 (不支持小数)
function add($num1, $num2)
{
if ($num1 == 0) {
return $num2;
}
if ($num2 == 0) {
return $num1;
}
$XORresult = $num1 ^ $num2;
$carry = ($num1 & $num2)<<1;
return add($XORresult,$carry);
} echo add(3,2); //5

2.php 函数error_reporting() 设置 PHP 的报错级别并返回当前级别。

error_reporting(E_ALL & ~E_NOTICE)

错误报告是按位的,先取得 E_ALL 的值(二进制)然后 再取得 E_NOTICE 的值(二进制),然后在通过 ~ 将其取反。

error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息 。
 error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息 。

php位运算及其高级应用的更多相关文章

  1. 【php】php位运算及其高级应用

    我们之前学过逻辑与(&&)      条件1 && 条件2 当两边条件同时成立时候返回1 逻辑或(||)         条件1 || 条件2    当两边条件只要有一 ...

  2. 位运算在 PHP 实际项目当中的高级运用

    我们首先来看一个系统中常见的需求: 有一个广告表,我们要对广告做显示控制: 手动上下线. 只允许 VIP 查看. 可能的表结构如下: CREATE TABLE `finger_ad` ( `ad_id ...

  3. javascript位运算

    javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面.不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与 ...

  4. PHP位运算 详细说明

    在实际应用中可以做用户权限的应用我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与 ...

  5. php位运算的应用(转)

    在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参 ...

  6. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  7. 位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  8. 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  9. 欧几里得算法(及扩展)&&快速幂(二分+位运算)

    最近在二中苦逼地上课,天天听数论(当然听不懂) 但是,简单的还是懂一点的 1.欧几里得算法 说得这么高级干什么,gcd入门一个月的人都会吧,还需要BB? 证明可参照其他博客(不会),主要就是gcd(a ...

随机推荐

  1. 2019.12.09 java循环(do……while)

    class Demo05{ public static void main(String[] args) { int sum=0; int i=1; do{ sum+=i; i++; }while(i ...

  2. 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度

    https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...

  3. javascript之命名空间方法封装

    详细代码如下: Object.prototype.namespace= function(name){ var parts = name.split('.'); var current = this; ...

  4. sublime text 3插件改造之添加从模版新增文件到指定目录

    简介:以前使用ST2里面的Sublime NFFT插件比较顺手,最近安装了ST3,但是Sublime NFFT插件不支持ST3,就下载了SublimeTmpl从模版新建文件插件.在使用时,习惯在侧边栏 ...

  5. Apache ranger整合hive报错记录

    版本信息如下: hadoop2.9.2 hive 2.x ranger 最新版2.1.0 在hive端部署完ranger 插件以后,在使用beeline连接查询数据库时报错,报错信息如下: verbo ...

  6. SpringCloud Feign 常用代码

    服务提供者 服务提供者,是位于其他项目里面的. 服务提供者提供的方法,在Controller层里面,有可访问的Url. @Controller @RequestMapping("/order ...

  7. 第09组 Alpha冲刺(4/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  8. 剑指offer:整数中1出现的次数

    题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...

  9. nginx 二级目录反向代理

    location /faceapi/ { #default_type application/json; # return 200 '{"status":"success ...

  10. Linux下查看目录文件数和文件大小

    一.查看当前目录下文件个数 在linux下查看目录下有多少文件可以用:ls -l  命令查看,ls -lR 递归查看所有目录, 如果文件很多,则用wc命令 和 grep 命令进行过滤. wc命令显示输 ...