php位运算及其高级应用
我们之前学过逻辑与(&&) 条件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位运算及其高级应用的更多相关文章
- 【php】php位运算及其高级应用
我们之前学过逻辑与(&&) 条件1 && 条件2 当两边条件同时成立时候返回1 逻辑或(||) 条件1 || 条件2 当两边条件只要有一 ...
- 位运算在 PHP 实际项目当中的高级运用
我们首先来看一个系统中常见的需求: 有一个广告表,我们要对广告做显示控制: 手动上下线. 只允许 VIP 查看. 可能的表结构如下: CREATE TABLE `finger_ad` ( `ad_id ...
- javascript位运算
javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面.不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与 ...
- PHP位运算 详细说明
在实际应用中可以做用户权限的应用我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与 ...
- php位运算的应用(转)
在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参 ...
- C语言中的位运算的技巧
一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...
- 位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 欧几里得算法(及扩展)&&快速幂(二分+位运算)
最近在二中苦逼地上课,天天听数论(当然听不懂) 但是,简单的还是懂一点的 1.欧几里得算法 说得这么高级干什么,gcd入门一个月的人都会吧,还需要BB? 证明可参照其他博客(不会),主要就是gcd(a ...
随机推荐
- 集成omnibus-ctl 开发一个专业的软件包管理工具
前边有转发过来自chef 团队的一篇omnibus-ctl 介绍文章,以下尝试进行项目试用 就是简单的集成,没有多少复杂的操作 环境准备 ruby ruby 使用2.6.3 使用 rbenv 安装,可 ...
- 81: luogu3370 hash
hash 模板题 #include <bits/stdc++.h> using namespace std; #define ULL unsigned long long const UL ...
- 洛谷P1902 刺杀大使
题目 二分加广搜 #include <bits/stdc++.h> using namespace std; int n, m, l, r, p[1001][1001], vis[1001 ...
- C博客作业
1.你对网络专业或者计算机专业了解是怎样? 信息化是国企的一个大趋势,目前正是红火的时候. - 网络是信息化必不可少的的基础和平台,随着信息化的进步,网络也必将水涨船高. - 我认为网络方向主要学的是 ...
- (12)Go面向对象
尽管Go中没有封装.继承.多态这些概念,但可以通过别的方式实现这个特性: *封装:通过方法实现 *继承:通过匿名字段实现 *多态:通过接口实现 package main import "fm ...
- Serlvet开发
javaweb学习总结(五)——Servlet开发(一) 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口 ...
- Swarm容器集群管理(超详细)
一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...
- 经典批处理实现自动关机(BAT)
经典批处理实现自动关机1.BAT @ECHO offTITLE 自动关机程序 作者:廖晓青 :startCLSCOLOR 1frem 使用COLOR命令对控制台输出颜色进行更改MODE con: CO ...
- 蓝绿部署、A/B测试以及灰度发布(金丝雀发布)
过去的10多年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上”Sliver Bullet“,但确实很实用.在有关于“微服务”.“DevOps”.“Cloud-nat ...
- 取消本地文件夹与SVN服务器的关联
我们在开发项目中用SVN作为版本管理工具时,从服务器下载到本地的项目是有.svn文件夹的,这个代表是与svn服务器代码相关联的,如果我们想取消本地文件夹与svn服务器的关联,那么有多种方法,这里介绍导 ...