PHP匿點之位運算按位取反

我們看示例:

<?php
$a = 8;
var_dump(~$a);
先不要看結果, 試想下結果是多少? 

然後我們運行下看看, 納尼? 和我們設想的不一樣,奇怪了  什麼原因呢

於是我們翻看PHP中文手冊: $a Not(按位非) 將 $a 中爲 的位設爲 1,反之亦然。 我只是簡單的理解爲:0變1,1變0。原來按位取反以十進制輸出並不是簡單理解成這樣。

首先要知道,在計算機中,負數以其正值的補碼形式表達。
這樣我們就要知道三個概念了,原碼,反碼和補碼。
原碼:一個整數,按照絕對值大小轉換成的二進制數,稱爲原碼。
反碼:將二進制數按位取反,所得的新二進制數稱爲原二進制數的反碼。取反操作指:1變0, 0變1。
補碼:反碼加1稱爲補碼。也就是說,要得到一個數的補碼,先得到反碼,然後將反碼加上1,所得數稱爲補碼。
正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1

由上所知,8按位取反以十進制輸出的過程:

//8的原碼
echo sprintf("%032b", 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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章