昨天晚上在看php书籍的时候,看到到了一个操作符“~”解释是按位取反操作符,因为平时用得不多所以对它不是很了解,所以顺便网上收了一下,感觉讲的不是特别清楚,所以我花了点时间研究了一下,终于有点成果,所以在此为大家分享一下,如果说的有误还请大家批评指出。好了,下面就来说说这个按位取反的运算方式。

    首先按照操作元来划分操作符,比如:$a>$b、$a>$b?1:0。第一个表达式中操作元是两个分别是$a和$b,所以这被称为二元运算,依此,表达式二就是三元。因此按位取反也就是一元运算符如:$a=~$b;

    其次我们要了解计算机运算时存储的数据是0,1这种二进制数据。并且是以源码的补码形式存储,下面引出三个概念:


    源码:一个整数,按照绝对值大小转换成二进制数,最高位为符号位是需要保留的。最高位0表示正数,1表示负数,比如(-3:1000 0000 0000 0000 0000 0000 0000 0011)。

      反码:就是源码的反转,最高符号位除外,其余的1变0,0变1。

      补码:也就是计算机存储的数据,定义为源码的反码加1。 (注意:正数的补码也就是它源码本身)


      这里还有一个东西需要说明,刚才在对源码进行阐述的时候看到-3这个数占了32位,我们就在考虑为什么是32位而不是其他的呢。其实我们可以了解到php5.X版本中整数的最大最小区间为-2e31到+2e31

其中有个符号位所以数值表达最高就是31次幂。在php的高版本中会达到64位也就是-2e63到+2e63,因为现在用的普片较多的版本就是5.X的版本所以就以32位二进制来讲。

      好了,现在对概念都理解了,下面我们就来看看具体操作:

      先来看代码运算结果

       

<?php
    $a = -3;
    $b = ~$a;
    var_dump($b);    // int 2
?>

    上面是-3按位取反后得到2,我们用上面的理论来分析一下:

    -3源码:1000 0000 0000 0000 0000 0000 0000 0011

      反码:1111 1111 1111 1111 1111 1111 1111 1100

      补码:1111 1111 1111 1111 1111 1111 1111 1101 (反码加1得到补码)

现在执行按位取反操作后:

      补码:0000 0000 0000 0000 0000 0000 0000 0010

      反码:0000 0000 0000 0000 0000 0000 0000 0010

      源码:0000 0000 0000 0000 0000 0000 0000 0010

为什么执行按位取反后源码和补码相同?嗯,其实上面已经解释了,在源码进行补码转换的时候符号位是不变的。我们看到按位取反操作后补码的符号位为0表示正数,而正数的补码就是源码本身。所以源码十进制换算后就是2了,我想这个就清楚了吧!现在是否明白了呢。。。<谢谢大家支持,成长从博客开始>