我们之前学过逻辑与(&&)      条件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做参考

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


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

echo  <<;  //

在计算下

echo  <<;  //36       相当于 9*4=18      在相当于  9*2的2次方
echo <<; //72 相当于 9*6=72 在相当于 9*2的3次方
echo <<; //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右移一位,如下,由于保持符号位不变,左边第二个是空,右边第一个被移出来

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


echo  >>;  //
echo >>; //4 8右移一位也等于4

右移和左移也有规律

echo  >>;  //
echo >>; //
echo >>; //  

得出

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

 

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

$a = ;
$b =;
$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 == ) {
return $num2;
}
if ($num2 == ) {
return $num1;
}
$XORresult = $num1 ^ $num2;
$carry = ($num1 & $num2)<<;
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】php位运算及其高级应用的更多相关文章

  1. 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. 开发环境搭建(lnmp)

    我们的开发环境一般现在时用Linux + Nginx + MySQL(mariaDB) + PHP的组合进行项目的搭建与开发,工欲善其事必先利其器. 搭建环境: Centos7 + mysql5.6 ...

  2. Azure系列2.1.5 —— BlobOutputStream

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  3. [转帖]CentOS 查看系统信息汇总

    CentOS 查看系统信息汇总 http://blog.itpub.net/15498/viewspace-2637493/ 感觉应该是 centos相关的 改了下名字 日志文件说明 /var/log ...

  4. Linux安装jdk环境

    前言: 又重新起了一个CentOS7,里面什么都没有,翻出以前CentOS7安装jdk的笔记,现在已经弃用有道云了,用博客比较多,所以把它移过来. 有道云笔记地址(CentOS7安装1.8jdk):h ...

  5. :before添加图片,IE8兼容

    这是项目开发中遇到的奇怪的小问题: 在IE8下出现按钮点击后消失了,鼠标点击页面后却又出现: 最初的代码:添加背景图片的方法,这样是存在兼容问题的. 更改后代码:content中添加图片,完美兼容IE ...

  6. JDK 环境变量的设置、eclipse、Tomcat的配置

    一.JDK的环境变量的设置 环境变量设置: JDK下载好后,(1)选择电脑属性-高级系统设置-高级-环境变量,接着在系统变量中(2)新建JAVA_HOME,变量值设置为下载好后JDK在电脑中的路径;( ...

  7. 循环神经网络RNN及LSTM

    一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数?  htt ...

  8. ES6字符串操作

    讨论字符串操作之前,我们先来了解一下Unicode 编码的由来,因为Js中的字符串就是一系列Unicode码的集合. 我们都知道,世界上存在着各种各样的语言,汉语,英语,日语等,相对应的,也就存在各种 ...

  9. Nginx 缓存针对打开的文件句柄与原文件信息

    L:108 open_file_cache syntax: open_file_cache off;   open_file_cache max=N[inactive=time](inactive表示 ...

  10. 进程创建fork()

    简单进程创建例子: #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include ...