位元運算符
位元運算符是指對二進位位從低位到高位對齊後進行運算。
| 符號 |
作用 |
舉例 |
個人理解 |
| & |
按位與 |
$m & $n |
全1為1,否則為0 |
| | |
按位或 |
$m | $n |
全0為0,有1為1 |
| ^ |
按位異或 |
$m | $n |
不同為1,相同為0 |
| ~ |
按位取反 |
~$m |
|
| << |
向左移位 |
$m << $n |
|
| >> |
向右移位 |
$m >> $n |
|
&運算子
<?php$m = 1;$n = 2;$mn = $m & $n;echo $mn;
運行結果為0
解釋:將1,2分別轉換為二進位為
00000001
00000010
在按位與的過程中,位元壓縮,全1為1,比較結果為00000000,所以輸出0 |運算子
<?php$m = 1;$n = 2;$mn = $m | $n;echo $mn;
運行結果為3,同樣,轉換成如上的二進位
00000001
00000010
在按位或的過程中,有1為1,全0為0,則結果為00000011,所以輸出3 ^運算子
<?php$m = 1;$n = 2;$mn = $m ^ $n;echo $mn;
運行結果為3,同樣,轉換成如上的二進位
00000001
00000010
在按位亦或的過程中,不同為1,相同為0,所以結果為00000011,進而輸出3。 ~運算子
<?php$m = 2;$m1 = ~$m;echo $m1;
運行結果為-3,此處引人深思。
註:在電腦中,負數以其正值的補碼形式表達。
1: 2的32位原碼為 0000 0000 0000 0000 0000 0000 0000 0010
2: 按位取反後為 1111 1111 1111 1111 1111 1111 1111 1101
由於最前面的數為1,符號位為1,即為負數,所以,以其正值的補碼形式表示為:(符號位不變,按位取反,末尾加1)
1000 0000 0000 0000 0000 0000 0000 0011
所以輸出為-3 <<運算子
<?php$m = 3;$m1=$m << 1;echo $m1;
運算結果為6
左移運算的實質是將對應的資料的二進位值逐位左移若干位,並在空出的位置上填0,最高位溢出並捨棄。
3的32位原碼為,0000 0000 0000 0000 0000 0000 0000 0011
左移一位:0000 0000 0000 0000 0000 0000 0000 0110
所以為6
根據手冊描述可以看出位元運算可以看出向左移一位,則是實現乘2運算。由於位移操作的運算速度比乘法的 運算速度高很多。因此在處理資料的乘法運算的時,採用位移運算可以獲得較快的速度。
提示 將所有對2的乘法運算轉換為位移運算,可提高程式的運行效率。 >>運算子
右移一位,和<<運算子,類似,只不過這個是右移,此處不在做過多解釋。