PHP位运算与二进制的理解

根据网友需求,整理了篇文章,如下:

function test_odd($var)
{
    return($var & 1);
}
 
$a1=array("a","b",2,3,4);
print_r(array_filter($a1,"test_odd"));

上述一段代码引发的对位运算的思考;
PHP位运算与二进制的理解_第1张图片

位运算符运算规则:
按位与&:两位全为1,结果为1
按位或|:两位有一个为1,结果为1
按位异或^:两位中一个为0,一个为1,结果为1
按位取反~:0取1,1取0
根据规则, 计算一个数的步骤:
例如计算:~2=?
1.找出2的补码,【因为计算机运算是以补码的方式来进行运算的】
2的原码:00000000 00000000 00000000 00000010
//上面的字串从左往右数第一个数为0,所以其为正数,而正数有个原则:正数的原码=反码=补码,所以2的补码就是上面这串数字

         2.再取反
          ~2取反: 11111111 11111111 11111111 11111101
         //上面的字串得到的是补码,要想获得我们想要的结果就要将补码-->反码-->原码
         3.补码-->反码  [(补码-1)就是反码]
          反码:11111111 11111111 11111111 11111100
         4.反码-->原码  [符号位不变,也就是上面的字串从左往右数第一个数不变]
          原码:10000000 00000000 00000000 00000011=1*2^0+1*2^1=1+2=-3  //前面的红色1表示负数,所以结果为-3
           //^表示次方,2^0表示2的0次方,从右往左开始计算:即1(上面这串数字从右往左数的第一个1)*2^0+1(上面这串数字从右往左数的第二个1)*2^1
      例如:2&3=?
          1.找到2和3的补码
             2的补码: 00000000 00000000 00000000 00000010
             3的补码: 00000000 00000000 00000000 00000011
                        //按位与&的运算:两位都为1,结果为1
         2&3= 00000000 00000000 00000000 00000010  // 前面的字串为补码,由于其第一个数字为0,所以其为正数,正数的补码=原码,所以结果为2
      终上:计算一个数的步骤就是原码-->反码-->补码-->根据位运算符计算得到补码-->反码-->原码-->再得到我们想要的值

位移运算:
在php中位移运算符有两种:>>(右移)和<<(左移)
运算的规则:
右移:低位溢出,符号位不变,并用符号位补溢出的高位 [通俗点就是将最右边的数溢出,用最左边的数(符号数)补溢出的个数,放在最左边]
左移:符号位不变,低位补0 [通俗点就是将最左边的数溢出,用0来补溢出的个数,放在最右边]

     根据规则,下面写几个案例:

             A. $a=1>>2;//将1向右移动两位
              1.找出1的补码:
                 00000000 00000000 00000000 00000001
              1>>2
                00000000 00000000 00000000 00000000
              $a=1>>2=0

            B. $a=1<<2;//将1向左移动两位
              1.找出1的补码
                 00000000 00000000 00000000 00000001
              1<<2
                00000000 00000000 00000000 00000100
              $a=1<<2=4

二进制:
二进制就是用0和1来表示计算机语言的,0,1可以表示任意数,其逢二进一
将十进制(即阿拉伯数字)转成二进制的计算步骤.
将217转化为二进制数11011001:
PHP位运算与二进制的理解_第2张图片
二进制有三个重要概念:
PHP位运算与二进制的理解_第3张图片
PHP位运算与二进制的理解_第4张图片
利用位运算判断奇偶性

一般用取模的方法来判断是否是奇偶数
比如:
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 //偶数

websites

你可能感兴趣的:(PHP)