符號 | 示例 | 含義 |
---|---|---|
& | $a & $b | 按位與。將 $a 和 $b 中都爲 1 的位設爲 1 |
| | $a | $b | 按位或。將 $a 和 $b 中任何一個爲 1 的位設爲 1 |
^ | $a ^ $c | 按位異或。將 $a 和 $b 中相同位不一致的位設爲 1 |
~$a | ~$a | 按位取反。將 $a 爲 1 的位設爲 0,爲 0 的位設爲 1 |
<< | $a << $c | 左移。將 $a 的位向 左 移動 $b 次 |
>> | $d >> $b | 左移。將 $a 的位向 右 移動 $b 次 |
按位與。相同爲 1,不一樣爲 0編程
$a = 1; // 0001 $b = 2; // 0010 echo $a & $b; // 0000
按位比較,相同位得1,不一樣位得 0。因爲 1 和 2 的二進制數中每一個位都不相同,因此結果爲: 0000,也就是 0。編程語言
按位或。有 1 爲 1,無 1 爲 0spa
$a = 1; // 0001 $b = 3; // 0011 echo $a | $b; // 0011
按位比較,相同位得 0 ,不一樣位 得 1,因此結果爲: 0011,也就是 3。操作系統
按位異或。相同爲 0,不一樣爲 1code
$a = 1; // 0001 $b = 3; // 0011 echo $a ^ $b; // 0010
按位比較,相同位得 0 ,不一樣位 得 1,因此結果爲: 0010,也就是 2。table
按位取反。1 取 0,0 取 1二進制
$a = 1; // 0000 0000 0000 0000 0000 0000 0000 0001 $a1 = ~$a; echo $a1; // -2。
這個運算符相比較其它位運算符要複雜一些。咱們知道,大多數編程語言中,最高位是符號位,那麼,32 位操做系統下,PHP 整數的最大值是:總結
0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647計算機
所以,當對 1 進行按位取反後,獲得tab
$A1 = 1111 1111 1111 1111 1111 1111 1111 1110
符號位爲 1,即爲 負數。在計算機中,負數以其對應絕對值的補碼形式表達。也就是說,$a1 的補碼是 $A1,則
反碼 = 補碼 - 1 = 1111 1111 1111 1111 1111 1111 1111 1101
那麼 $a1 對應的整數就是:
原碼 = 反碼各位取反 = 0000 0000 0000 0000 0000 0000 0000 0010 = -2;
各位向左移動,末尾補 0
$a = 2; // 0000 0000 0000 0000 0000 0000 0000 0010 $a1 = $a << 3; echo $a1; // 16
32 位系統下,一個整數用 32 位表示。當位數向左移動,捨去多餘的位數,末尾補 0 ,則獲得 $a1 爲:
0000 0000 0000 0000 0000 0000 0001 0000 = 16
所以
$a << $b = $a^($b+1) // $a 的 ($b + 1) 次方
左移運算符有一個比較有趣的地方,當一個數向左移動超過計算機指定整數位時,就會出現不符合咱們上述總結的原數平方規則的狀況。好比 2 在 64 位系統下,向左移動 6二、6三、64 位:
echo 2 >> 61 // 4611686018427387904 echo 2 >> 62 // -9223372036854775808 echo 2 >> 63 // 0 echo 2 >> 64 // 0
有興趣的朋友能夠列出對應二進制數,推演下計算過程。
各位向右移動,前面補 0
$a = 8; // 0000 0000 0000 0000 0000 0000 0000 1000 $a1 = $a << 3; echo $a1; // 16
關於左移和右移運算符,不少朋友可能會看到這樣的總結:
左移平方,右移開方
其實嚴格來講,這隻針對值爲 2 的正整數次冪的整數有效。當不是 2 的正整數次冪時,好比:
$a = 9; // 0000 0000 0000 0000 0000 0000 0000 1001 $a1 = $a >> 1; echo $a1; // 4
因此,遇到左移和右移運算符時,要實際狀況實際分析,不能一味的按照別人的總結走。