這個涉及到系統底層,WEB開發中幾乎沒用到,知道下有這個東西就好了。底層的東西解釋總是簡單不了的。
變量在內存中的存放都是二進制數字。整數在32位系統上是占用4字節,一個字節是8位,也就是32位,位運算就是位級的運算操作了。
$a << $b Shift left(左移) 將 $a 中的位向左移動$b 次(每一次移動都表示“乘以 2”)。
假定變量
那麼
00000000 00000000 00000000 00000011
每執行一次左移,都將所有的位向左移動,右邊補零,左邊超過的捨棄。
所以
00000000 00000000 00000000 00011000
也就是
$a >> $b Shift right(右移) 將 $a 中的位向右移動$b 次(每一次移動都表示“除以 2”)。
假定變量
那麼
00000000 00000000 00000000 00011000
每執行一次右移,都將所有的位向由移動,右邊超過的捨棄,左邊空出的位補零。
所以
00000000 00000000 00000000 00000110
也就是
位移運算是系統底層運算,運算的速度比乘除還要快很多,優化代碼優化到極致的時候,可以將數換算成二的公倍數,然後進行位移計算。但在WEB開發中幾乎沒有任何必要,而且超過系統底層了,程序在的可移植性就會降低。
其他的位運算符也是差不多的。比如:
$a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。
假定變量
$a:
00000000 00000000 00000000 00000101
$b:
00000000 00000000 00000000 00000110
$a
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000110
───────────────────────────
00000000 00000000 00000000 00000100
豎的看,上下都是
所以
~ $a Not(按位非) 將 $a 中為 0 的位設為 1,反之亦然。
~ $a:
00000000 00000000 00000000 00000101
───────────────────────────
11111111 11111111 11111111 11111010
如果
如果
以下的就不詳細介紹了:
$a | $b Or(按位或) 將把 $a 或者 $b 中為 1 的位設為 1。
$a ^ $b Xor(按位異或) 將把 $a 和 $b 中不同的位設為 1。
平常說的幾位的系統,就是系統處理整數的時候,是多少個位同時計算的,上面的例子都是基於32位系統。因為移動時超過的位將被捨棄,如果是64位或12位的,位移的結果就可能不一樣了,要將計算時位的數量調整下。
from:http://blog.sina.com.cn/s/blog_815611fb01017wtj.html