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 ...
随机推荐
- [RN] React Native 常见基本问题归纳总结
[RN] React Native 常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...
- c++ Size capacity Resize reserve shrink_to_fit
- kerberos 配置错误记录
服务端错误记录: 1.服务端在创建数据库的时候报如下错误: # kdb5_util -s -r HADOOP.HOME 错误提示:kdb5_util: Improper format of Kerbe ...
- Linux设置开机挂载
Linux可不可以在开机的时候就将我们要的文件系统都挂载好?这样就不需要每次进入Linux系统还要挂载一次.当然可以,那就直接到/etc/fstab里面去修改. 系统挂载的一些限制: - 根目录/是必 ...
- 刷题记录:[CISCN2019 总决赛 Day1 Web4]Laravel1
目录 刷题记录:[CISCN2019 总决赛 Day1 Web4]Laravel1 解题过程 刷题记录:[CISCN2019 总决赛 Day1 Web4]Laravel1 题目复现链接:https:/ ...
- APP性能测试工具GT的使用总结:app内存测试
APP性能测试工具GT的使用总结:app内存测试 GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment). ...
- ERROR: relation "pg_buffercache" does not exist
创建pg_buffercache后,查询时报错: postgres=# create extension pg_buffercache; postgres=# select * from pg_buf ...
- git clone速度太慢的解决办法(亲测还有效)
https://www.linuxidc.com/Linux/2019-05/158461.htm 1.查找域名对应的ip地址,并修改hosts文件 linuxidc@linuxidc:~/linux ...
- python基于redis实现分布式锁
阅读目录 什么事分布式锁 基于redis实现分布式锁 一.什么是分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无 ...
- PLSQL查询执行计划
转: PLSQL查询执行计划 01(转) 2019-05-15 15:15:43 p享自由q 阅读数 365 一般优化途径: 如果能通过修改语句优化,比如查询条件或执行顺序,sql改不了,可以通过 ...