首頁  >  文章  >  後端開發  >  php 位元運算中的位元取反到底什麼意思?

php 位元運算中的位元取反到底什麼意思?

怪我咯
怪我咯原創
2017-06-20 13:44:066459瀏覽

先看代码:

$a=8;
$b=~$a; //按位取反
echo "\$a=".$a."<br>";
echo "\$b=".$b;

输出结果:

$a=8
$b=-9

结果跟我所想的不一样啊,因为在PHP中文手册中说: ~ $a Not(按位非) 将 $a 中为 0 的位设为 1,反之亦然。 我只是简单的理解为:0变1,1变0。原来按位取反以十进制输出并不是简单理解成这样。

首先要知道,在计算机中,负数以其正值的补码形式表达。
这样我们就要知道三个概念了,原码,反码和补码。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。取反操作指:1变0, 0变1。
补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
正数的补码与其原码相同;负数的补码是在其反码的末位加1

由上所知,8按位取反以十进制输出的过程:
1、8的原码为:0000 0000 0000 0000 0000 0000 0000 1000
2、按位取反:1111 1111 1111 1111 1111 1111 1111 0111;由于最前面一位为1,所以为负数。即即按位取反后得的为负数
下面以十进制输出:负数以其正值的补码形式表达:
3、2步所得的数(是其正为取反,符号不变,最高位还是为1)取反:1000 0000 0000 0000 0000 0000 000 1000
4、反码加1:1000 0000 0000 0000 0000 0000 000 1001;这样就得负数的正值的补码形式。也就是-9了。

再举一例子啊。如2按位取反。
0000 0000 0000 0000 0000 0000 0000 0010(原码)
1111 1111 1111 1111 1111 1111 1111 1101(按位取反)
1000 0000 0000 0000 0000 0000 000 0010 (正值的反码,符号不变)
1000 0000 0000 0000 0000 0000 000 0011 (加1,结果为-3)
代码和结果如下: 

<?php
$a=2;
$b=~$a;  //按位取反
echo "\$a=".$a."<br>";
echo "\$b=".$b;
?>

结果:

$a=2
$b=-3

以上是php 位元運算中的位元取反到底什麼意思?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn