我们看示例:
<?php
$a = 8;
var_dump(~$a);
先不要看结果, 试想下结果是多少?
然后我们运行下看看, 纳尼? 和我们设想的不一样,奇怪了 什么原因呢
于是我们翻看PHP中文手册:
首先要知道,在计算机中,负数以其正值的补码形式表达。
这样我们就要知道三个概念了,原码,反码和补码。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。取反操作指:1变0,
补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
正数的补码与其原码相同;负数的补码是在其反码的末位加1
由上所知,8按位取反以十进制输出的过程:
//8的原码
echo sprintf("%032b", 8);
1、8的原码为:0000 2、按位取反:1111
下面以十进制输出:负数以其正值的补码形式表达:
3、2步所得的数(是其正为取反,符号不变,最高位还是为1)取反:1000
4、反码加1:1000
再举一例子
如2按位取反
0000
1111
1000
1000
代码和结果如下:
<?php
$a=2;
$b=~$a; //按位取反
echo "\$a=".$a."<br>";
echo "\$b=".$b;
?>
结果:
$a=2
$b=-3