陳力:傳智播客古代 珍寶幣 泡泡龍遊戲開發第27講:PHP位運算

zhenbaobe發表於2015-07-22

陳力:傳智播客古代 珍寶幣 泡泡龍遊戲開發第27講:PHP位運算

  PHP程式設計語言中有哪些位運算,二進位制的原碼、反碼、補碼等怎麼表示。按位與&、按位或|、按位異或^、按位取反~,算術左移、算術右移等都是貴陽網站建設中必須掌握的內容。本節為陳力:傳智播客古代 珍寶幣 泡泡龍遊戲開發第27講:PHP位運算

一、二進位制
    二進位制(Binary)是逢2進位的進位制,0、1是基本算符。所謂二進位制就是逢二進一(0,1),因為使用二進位制只有0、1兩個數,簡單,易於電子方式實現,同時,通過0、1 組合可以表示任意一個數。
現代的電子計算機技術全部採用的是二進位制,因為它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。計算機內部處理的資訊,都是採用二進位制數來表示的。二進位制(Binary)數用0和1兩個數字及其組合來表示任何數。進位規則是“逢2進1”,數字1在不同的位上代表不同的值,按從右至左的次序,這個值以二倍遞增。 
網上對原碼、反碼、補碼的解釋過於複雜,本文在貴陽網站建設中總結出以下精簡的幾句話:
   對於有符號的而言:
   ①二進位制的最高位是符號位: 0表示正數,1表示負數。
   ②正數的原碼、反碼、補碼都一樣。
   ③負數的反碼=它的原碼符號位不變,其它位取反(0->1,1->0)。
   ④負數的補碼=它的反碼+1。
   ⑤0的反碼、補碼都是0。
   ⑥php沒有無符號數,換言之,php中的數都是有符號的。
   ⑦在計算機運算的時候,都是以補碼的方式來運算的。
有關二進位制的三個重要的概念:
(1)原碼:用二進位制來表示一個數,這個碼就是原碼。
數字5的原碼錶示為  00000000 0000000 0000000 00000101 = 1*2的零次方+0*2的一次方+1* 2的二次方=1+0+4=5
(2)反碼:負數的反碼=它的原碼符號位不變,其它位取反(0變成1,1變成0)
-1的原碼 10000000 00000000  00000000 00000001
-1的反碼 11111111 11111111  11111111 11111110
-1 的補碼 11111111 11111111 111111111 11111111
(3)補碼:在計算機運算的時候,都是以補碼的方式來運算的。不管一個數是正數還是負數,都要被轉成補碼,然後進行運算。

二、位運算

 位運算一覽表 
軟體設計,PHP位運算,貴陽網站建設

在上圖中,前面四個是位運算。
其運算規則是:
按位與&:兩位全為1,結果為1。全1出1。
按位或|:  兩位中有一個為1,結果為1。有1出1。
按位異或^ :兩位一個為0,一個為1,結果為1。01出1,11出0,00出0。
按位取反~: 0變1 ,1變0。0出1,1出0。
例:~2=?
步驟1 :首先要求出 2的補碼
2是正數:原碼=反碼=補碼
2的原碼:00000000 00000000 00000000 00000010
步驟2:按位取反:
11111111 11111111 11111111 11111101。通過補碼也可以推出原碼。
補碼也可以推出原碼:由於負數的原碼-》反碼-》補碼,所以進行反推時,
11111111 11111111 11111111 11111101->
推出其反碼 :將補碼-1
11111111 11111111 11111111 11111100
推出原碼:符號位不變,再按位取反。
10000000 00000000 00000000 0000011 -> -3
所以結果為-3。
例:~-5=?
-5 的 補碼先求出來:
-5 原碼  10000000 00000000 00000000 00000101
-5 反碼  11111111 11111111 11111111 11111010
-5 補碼  11111111 11111111 11111111 11111011
~-5取反 00000000 00000000 00000000 00000100 (這結果也是補碼形式,要轉成原碼形式再輸出。因為符號位為正數,所以原碼、反碼和補碼都是一樣的。)

例:2&3=? 
 2&3 首先要找到 2 和 3的補碼
2 的補碼  00000000 00000000 00000000 00000010
3 的補碼  00000000 00000000 00000000 00000011
2&3       00000000 00000000 00000000 00000010 [結果也是補碼形式,因是正數無需再轉換]

例:2|3=?
    2 的補碼  00000000 00000000 00000000 00000010
    3 的補碼  00000000 00000000 00000000 00000011
  2|3       00000000 00000000 00000000 00000011

例:2^3
    2 的補碼 00000000 00000000 00000000 00000010
    3 的補碼  00000000 00000000 00000000 00000011
    2^3      00000000 00000000 00000000 00000001
    可以手動計算:13&7=?   5|4=?   -3^3=?

三、位移運算
    在php程式設計語言中,位運算有兩種 >> (右移) <<(左移)。
    運算的規則是:
    算術右移:低位溢位,符號位不變,並用符號位補溢位的高位。
    算術左移:符號位不變,低位補0。
    根據前面的規範,來完成幾個案例:
$a=1>>2; 
先求出1的補碼:
00000000 00000000 00000000 00000001
1>>2
00000000 00000000 00000000 00000000
例:$b=-1>>2;
  步驟 -1 的補碼:
  -1 的原碼 10000000 00000000 00000000 00000001
       -1 的反碼 11111111 11111111 11111111 11111110
       -1 的補碼 11111111 11111111 11111111 11111111
      -1 >> 2
        11111111 11111111 11111111 11111111 (補碼形式的,要轉換成原碼)
     補碼->原碼:
        反碼 11111111 11111111 11111111 11111110
        原碼 10000000 0000000 00000000 00000001
     結果為-1。
例:$c=1<<2; 
    先求出1的補碼:
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
  結果為4。

【推薦閱讀】陳力:傳智播客古代 珍寶幣 泡泡龍遊戲開發第27講:PHP位運算


相關文章