PHP位操作符
二進(jìn)制怎么算
http://www.doc88.com/p-474114598610.html
?
這個(gè)涉及到系統(tǒng)底層,WEB開發(fā)中幾乎沒用到,知道下有這個(gè)東西就好了。底層的東西解釋總是簡(jiǎn)單不了的。
變量在內(nèi)存中的存放都是二進(jìn)制數(shù)字。整數(shù)在32位系統(tǒng)上是占用4字節(jié),一個(gè)字節(jié)是8位,也就是32位,位運(yùn)算就是位級(jí)的運(yùn)算操作了。
$a << $b Shift left(左移) 將 $a 中的位向左移動(dòng) $b 次(每一次移動(dòng)都表示“乘以 2”)。
假定變量?
那么? $a? 在內(nèi)存中的存放的格式是:
00000000 00000000 00000000 00000011
每執(zhí)行一次左移,都將所有的位向左移動(dòng),右邊補(bǔ)零,左邊超過的舍棄。
所以? $a? 左移? 2? 得到的是:
00000000 00000000 00000000 00001100
也就是? 12。相當(dāng)于? 3 × 2 × 2 = 12。
$a >> $b Shift right(右移) 將 $a 中的位向右移動(dòng) $b 次(每一次移動(dòng)都表示“除以 2”)。
假定變量? $a? 的值是? 24,$b? 的值是? 2。
那么? $a? 在內(nèi)存中的存放的格式是:
00000000 00000000 00000000 00011000
每執(zhí)行一次右移,都將所有的位向由移動(dòng),右邊超過的舍棄,左邊空出的位補(bǔ)零。
所以? $a? 右移? 2? 得到的是:
00000000 00000000 00000000 00000110
也就是? 6。相當(dāng)于? 24 ÷ 2 ÷ 2 = 6。
位移運(yùn)算是系統(tǒng)底層運(yùn)算,運(yùn)算的速度比乘除還要快很多,優(yōu)化代碼優(yōu)化到極致的時(shí)候,可以將數(shù)換算成二的公倍數(shù),然后進(jìn)行位移計(jì)算。但在WEB開發(fā)中幾乎沒有任何必要,而且超過系統(tǒng)底層了,程序在的可移植性就會(huì)降低。
其他的位運(yùn)算符也是差不多的。比如:
$a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設(shè)為 1。
假定變量? $a? 的值是? 5,$b? 的值是? 6。
$a:
00000000 00000000 00000000 00000101
$b:
00000000 00000000 00000000 00000110
$a? &? $b? :
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000110
───────────────────────────
00000000 00000000 00000000 00000100
豎的看,上下都是? 1? 的得到? 1? ,否則就是? 0。
所以? $a? &? $b? =? 4。
~ $a Not(按位非) 將 $a 中為 0 的位設(shè)為 1,反之亦然。
~ $a:
00000000 00000000 00000000 00000101
───────────────────────────
11111111 11111111 11111111 11111010
如果? $a? 是有符號(hào)整數(shù),第一位是符號(hào)位,1表示負(fù)數(shù),那么? ~ $a = -2147483642。
如果? $a? 是無符號(hào)整數(shù),第一位還是數(shù)據(jù)位,那么? ~ $a = 4294967290。
以下的就不詳細(xì)介紹了:
$a | $b Or(按位或) 將把 $a 或者 $b 中為 1 的位設(shè)為 1。
$a ^ $b Xor(按位異或) 將把 $a 和 $b 中不同的位設(shè)為 1。
平常說的幾位的系統(tǒng),就是系統(tǒng)處理整數(shù)的時(shí)候,是多少個(gè)位同時(shí)計(jì)算的,上面的例子都是基于32位系統(tǒng)。因?yàn)橐苿?dòng)時(shí)超過的位將被舍棄,如果是64位或12位的,位移的結(jié)果就可能不一樣了,要將計(jì)算時(shí)位的數(shù)量調(diào)整下。
總結(jié)
- 上一篇: 辽源a货翡翠,张掖a货翡翠
- 下一篇: 雷林鹏分享:PHP 数组排序