常見四個位運算符:&(按位與),|(按位或),^(按位異或),~(按位取反)php
&(按位與):對應位同時爲1時,在&運算後則爲1,不然爲0html
|(按位或):對應位有一個爲1時,在|運算後則爲1,同爲0時則爲0spa
^(按位異或):對應位不一樣時爲1時,在^運算後爲1,同時爲0時則爲0,同時爲1時^運算後也是0.net
~(按位取反):$a+(~$a)=-1htm
在計算機中,負數以其正值的補碼形式表達。
在這裏咱們就要知道三個概念了,原碼,反碼和補碼。blog
原碼:一個整數,按照絕對值大小轉換成的二進制數,稱爲原碼。二進制
8的原碼爲:0000 0000 0000 0000 0000 0000 0000 1000計算機
反碼:將二進制數按位取反,所得的新二進制數稱爲原二進制數的反碼。取反操做指:1變0, 0變1。co
8按位取反:1111 1111 1111 1111 1111 1111 1111 0111位運算
補碼:反碼加1稱爲補碼。也就是說,要獲得一個數的補碼,先獲得反碼,而後將反碼加上1,所得數稱爲補碼。
正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1
反碼加1:1000 0000 0000 0000 0000 0000 000 1001;這樣就得負數的正值的補碼形式。也就是-9了。
參考:http://www.cnblogs.com/setsail/archive/2013/05/22/3093542.html
http://my.oschina.net/WarRome/blog/90707
以上解釋本身也沒有看的太懂,但實踐得出$a+(~$a)=-1
小例以下:
<?php
$m=8;
$n=12;
$p=-109;
$mn=$m&$n;
echo $mn."<br>";
$mn=$m|$n;
echo $mn."<br>";
$mn=$m^$n;
echo $mn."<br>";
$mn=~$m;
echo $mn."<br>";
$mn=~$p;
echo $mn."<br>";
?>
輸出結果:
8
12
4
-9
108
關於按位取反的問題,再琢磨琢磨