PHP位運算符
位運算符
位運算符是指對二進制位從低位到高位對齊後進行運算。
符號 | 作用 | 舉例 | 個人理解 |
---|---|---|---|
& | 按位與 | $m & $n |
全1為1,否則為0 |
| | 按位或 | $m | $n |
全0為0,有1為1 |
^ | 按位異或 | $m | $n |
不同為1,相同為0 |
~ | 按位取反 | ~$m |
|
<< | 向左移位 | $m << $n |
|
>> | 向右移位 | $m >> $n |
正數的原碼,反碼、補碼都是一樣的,負數不一樣
原碼:數字的8位 二進制,符號位(第一位)為0表示正數,為1表示負數
反碼:正數反碼與原碼一樣,負數的反碼是符號位1不變,整數的每一位二進制數位求反,得到反碼
補碼:正數補碼與原碼一樣,負數反碼的符號位1不變,按位取反,末尾(最低位)加1;計算機中的運算都是以補碼的形式運算的,存儲也是補碼
補碼的特性:
1、一個負整數(或原碼)與其補數(或補碼)相加,和為模。
2、對一個整數的補碼再求補碼,等於該整數自身。
3、補碼的正零與負零表示方法相同。
&運算符
<?php $m = 1; $n = 2; $mn = $m & $n; echo $mn;
運行結果為0
解釋:將1,2分別轉換為二進制(8 位)為
00000001
00000010
在按位與的過程中,按位比較,全1為1,比較結果為00000000,所以輸出0。
負數的 & 運算
以2&-7=?計算為例:
(1)、計算2的補碼: 2->原碼:00000010->反碼:00000010->補碼:00000010
(2)、計算-7的補碼: -7->原碼:10000111->反碼:11111000->補碼:11111001
(3)、計算2&-7的補碼->反碼->原碼 2&-7補碼:00000000->反碼:00000000->原碼:00000000
(4)、有2&-7原碼得到2&-7的值 所以2&-7 = 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的乘法運算轉換為位移運算,可提高程序的運行效率。
>>運算符
右移一位,和<<運算符,類似,只不過這個是右移。
查看文章:原碼、反碼、補碼之間的轉換和簡單運算
php位運算詳解
PHP位運算符詳解
PHP位運算符