1. 程式人生 > >PHP實現無符號右移(js中的 >>>)

PHP實現無符號右移(js中的 >>>)

tail php art aik http 左移 com 過程 tps

移位包括有符號左移(<<)、有符號右移(>>)、無符號右移(>>>),其中 js 支持三種移位,PHP只支持前兩種移位(沒查到第三種),恰好需要PHP進行無符號右移,此處實現一下。先看結果 將數字 $a 向右無符號移動 $n 位

下面是這樣做的理由
1、有符號右移的過程

2 >> 1
2在計算機中存儲的二進制表示為
000000000  00000000  00000000  00000010
向右移動1位,高位補0
000000000  00000000  00000000  00000001
結果為1
-2 >> 1
負數的存儲是以補碼的方式存儲的(相關知識自行了解),這裏簡單說明
符號位是 1,-2的表示為
100000000  00000000
00000000 00000010 補碼:除符號位外,其他位按位取反,然後 + 1 11111111 11111111 11111111 11111101 11111111 11111111 11111111 11111110 向右移動1位,高位補1 11111111 11111111 11111111 11111111 結果為 -1(轉換成10進制後) 註意:移位操作是按照計算機中實際存儲的二進制形式進行移動的

2、無符號右移的過程

2 >> 1同上
-2 >> 1
補碼右移1位,高位補 0
01111111  11111111  11111111  11111111
結果是 2147483647 無符號右移 n 位,即把所有位向右移動 n 位(有符號右移),然後把前 n 位變成 0。 要把前 n 位變成 0 ,只需要讓其跟一個前 n 位是 0,後 32-n 位是 1 的數進行按位與就可以了。 構造前 n 位是 032-n 位是 1 的數:利用正數有符號右移高位補 0 實現,這裏用 2147483647 這個正數實現(當然其他數也可以),這個數在計算機中的存儲前面已經說了,是 01111111 11111111 11111111 11111111 利用這個數構造前 n 位是 0 的數,只需將其向右移動 n-1 位就行了 -2 無符號右移 2位的過程
-2右移2位:11111111 11111111 11111111 11111111 構造數: 00111111 11111111 11111111 11111111 按位與: 00111111 11111111 11111111 11111111

其他了解:

https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin

轉: https://blog.csdn.net/u010320108/article/details/77967711

PHP實現無符號右移(js中的 >>>)