请先看代码。 $a=8;
$b=~$a; //逐位反转
echo '$a='.$a.'
';
echo '$b='.$b;
输出结果: $a=8
$b=-9
结果和预想的不一样呢。 因为在PHP的中文手册中,$anot (按位)说,$a中的0位为1,反之亦然。 我只是理解0等于1,1等于0。 原本以位为单位反过来以十进制输出,并不是这样被理解的。
首先,要知道在计算机中,负数表示为其正值的补数。
现在,您需要知道三个概念:原码、反码和完成码。
原码:以绝对值大小转换的二进制数,是一个称为原码的整数。
反码:按位反取二进制数,得到的新二进制数称为原二进制反码。 反向操作是指1等于0,0等于1。
补数:反符号加1称为补数。 也就是说,要得到一个数的补数,首先要得到解码,然后在解码上加1,得到的数称为补数。
正数补数与其原码相同; 负数的补数是其反码的最后一位加1
综上所述,每8位反转并以10进制输出的过程:
1、8的源代码为: 000000000000000000000000000000000000000000000000
2、逐位反转: 111111111111111111111111111111111111111111111111111111111110111; 因为最前面的位数是1,所以是负的。 也就是说,每个比特反过来得到的是负数
下一个以十进制输出。 负数表示为该正值的补数。
3、两步得到的数(其正相反,符号不变还是最高位为1 )取反: 1000000000000000000001000
4、反码加1:100000000000000000000000000000000000000000001; 这样就变成负数正值的补数形式。 也就是-9。
让我再举一个例子。 每2位反转时。
00000000000000000000000000000000000000000000010 (源代码) ) ) ) ) ) ) )。
1111111111111111111111111111111111111111111101 (按比特反转) ) ) ) ) )。
100000000000000000000000000000000000000000010 (符号不会因正值的反符号而变化) ) ) ) ) ) )。
10000000000000000000000000000000000000000011 (加1,结果-3) ) ) ) ) ) )。
代码和结果如下。 php
$a=2;
$b=~$a; //逐位反转
echo '$a='.$a.'
';
echo '$b='.$b;
?
结果: $a=2
$b=-3