位運算符

位運算一覽表

符號 示例 含義
& $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

因此,遇到左移和右移運算符時,要實際狀況實際分析,不能一味的按照別人的總結走。

相關文章
相關標籤/搜索