位运算
在这里,将小结一下位运算符的运算,废话就不这么多了
位运算符有按位与(&),按位或(|),按位异或(^),按位取反(~),向左移动(<<),向右移动(>>)
现在给出两个变量,$m=8,$n=12;问:$mn=$m&$n; echo $mn;
那么输出结果是多少呢?答案是8,你是否算到了?老鸟就飘过啊,咳咳……
接下来,见证奇迹的时刻哈!
标题是位运算,当然就是要根据位来进行运算了,
$m=8;在计算机中存储为二进制(1000);
$n=12;在计算机中存储为(1100);
那么按位与运算(两者为1时才为真,1) 1000&1100==>1000,将所得的二进制数转化为十进制就是8啦,同理啦,按位或(只要有一个为1就是真),得到的是12,
按位取异或(两者不同是就是真,1^0或0^1为真,1)呢,一样的,1000^1100==>0100,答案为4;
接下来,才是精彩小亮点,$mn=~$m;echo $mn;那么答案是多少呢?【按位取反 二进制位是1,变成0,是0的 ,变成1 】
你算得是7吗?嗯,恭喜你了,你算错了,答案是 -9 呢,不信你试一试!
为什么呢? 想明白这个,我们要知道数据在内存中存放,同时二进制是以补码的形式在内存中存放的,另外,正数补码、反码都是本身,
在二进制中存储每个数都有一个符号位,如$m=8;就是01000,第一个0代表符号位,0代表正,1代表负,
求解步骤:(以$m=8为例)
1.将要求的数$m=8正常取反(0变成1,1变成0)得10111
2.由第1步得到的二进制数减去1,得到10110,
3.符号位不变,别的位取反,得到11001,
4.转换为十进制,即~$m==>-9;
向左移动,向右移动,就是比较简单的,
如$m=8; $mn=$m>>2;echo $mn;
意思是$m向右移动2位,即1000向右移动两位,得到10也就是十进制的 2 了,
$m=8; $mn=$m>>4; echo $mn;又是多少呢?
是0;
另外,左移运算就是移动一位,末尾补上一个0,故$m<<2;
值为32;就是这么简单,就到这吧,个人认为笔试的时候比较有可能拿取反运算来坑人