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

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

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


一. & 按位与

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

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

     计算过程

1001

0101

---------

0001

 php代码

1echo 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

1echo 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每个二进制位取反。

1

2

~0000 0000 0000 0000     0000 0000 0000  1001

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

1 echo ~9; // -10

五. << 位运算左移  

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

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

    举例:  <<9

   下面用0做参考

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

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

echo  9<<1;//18


在计算下

echo  9<<2; //36      相当于 9*4=36      在相当于  9*2的2次方 

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

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

echo  9>>1;//4

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


 右移和左移也有规律

echo  8>>1; //4

echo 8 >>2; //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 之外的所有错误信息 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容