1. 程式人生 > 其它 >[轉載]《更好的解釋(數學篇)》——第四章

[轉載]《更好的解釋(數學篇)》——第四章

  • PHP 位運算

     

    位運算:

    一、先求出二進位制:
    -3原碼: 10000000 00000000 00000000 00000011  
    -3反碼: 11111111 11111111 11111111 11111100 //取反,但符號位不變。
    -3補碼: 11111111 11111111 11111111 11111101 //反碼加1

    注意:
    1、正數的原碼、反碼、補碼都是一樣的。
    2、計算機運算是以補碼形式進行的,故計算時先統一轉成補碼,計算後(補碼)逆轉成原碼。

    二、按位與& :除去符號位,同1為1。
    例:-3&2
    -3 補碼:11111111 11111111 11111111 11111101
     2 補碼:00000000 00000000 00000000 00000010     
    結果補碼:00000000 00000000 00000000 00000000//最高位也參與運算,因為一正一負,總得有個了斷吧
         結果:0,由於正數三碼統一,故處已是結果,補碼即原碼。

    例:-3&-6
    -3 補碼:11111111 11111111 11111111 11111101
    -6 補碼:11111111 11111111 11111111 11111010
    結果補碼:11111111 11111111 11111111 11111000
    結果反碼:11111111 11111111 11111111 11110111//補碼減1
    結果原碼:10000000 00000000 00000000 00001000 //反碼再求反之後,-8

    總結:
    1、有正為正。
    2、在結果為負,並且左邊全是1,右邊全是0,則結果從最後一個 1 取到最後,即:11111000 => 1000 => 8 => -8
    2、當一個負數是2^n時,它的補碼:補碼等於原碼有效數字所位,前補1,後補0。
    -8 => 1 <1> 000 => 11000 //當然,前面還可以補許多1,但沒意義,只要位數夠運算就行
    -2 => 1 <1> 00 =>  11100

    11000
    11100
    11000//結果補碼,結果便是:1000 => 8 取負,-8

    三、按位或| :除去符號位,有1為1
    例:-3|-6
    -3 補碼:11111101
    -6 補碼:11111010
    結果補碼:11111111
    結果反碼:11111110//補碼減1
    結果原碼:00000001 //反碼再求反,-1

    總結:
    1、有負為負。

    四、按位異或^ :相異為1,相同為0
    例:-3^-6
    -3 補碼:11111101
    -6 補碼:11111010
    結果補碼:00000111//已然為正,故為7

    總結:同號為正,異號為負。

    五、按位取反~ :0、1互換
    例:~-3
    -3 補碼:11111101
    結果補碼:00000010//已然為正,故為2

    總結:正負相換。

    六、按位右移>> : 排除符號位,二進位制數整體向右移動。

    7 >> 2 => 0111 => 0001 = 1 // 這裡向右移動了2位,最低位的兩個1被抹去。

    七、按位左移<< : 與上同理。
    7 << 2 => 0111 => 011100 = 28 // 這裡向右移動了2位,最低位的兩個1被抹去。
    總結:右移兩位等於除了2的二次方,7/4 = 1 在整數除法中則看成是被舍掉了小數部分。左移就是剩以2的二次方,PHP沒有無符號右移運算子>>>

位運算:

一、先求出二進位制:
-3原碼: 10000000 00000000 00000000 00000011  
-3反碼: 11111111 11111111 11111111 11111100 //取反,但符號位不變。
-3補碼: 11111111 11111111 11111111 11111101 //反碼加1

注意:
1、正數的原碼、反碼、補碼都是一樣的。
2、計算機運算是以補碼形式進行的,故計算時先統一轉成補碼,計算後(補碼)逆轉成原碼。

二、按位與& :除去符號位,同1為1。
例:-3&2
-3 補碼:11111111 11111111 11111111 11111101
 2 補碼:00000000 00000000 00000000 00000010     
結果補碼:00000000 00000000 00000000 00000000//最高位也參與運算,因為一正一負,總得有個了斷吧
     結果:0,由於正數三碼統一,故處已是結果,補碼即原碼。

例:-3&-6
-3 補碼:11111111 11111111 11111111 11111101
-6 補碼:11111111 11111111 11111111 11111010
結果補碼:11111111 11111111 11111111 11111000
結果反碼:11111111 11111111 11111111 11110111//補碼減1
結果原碼:10000000 00000000 00000000 00001000 //反碼再求反之後,-8

總結:
1、有正為正。
2、在結果為負,並且左邊全是1,右邊全是0,則結果從最後一個 1 取到最後,即:11111000 => 1000 => 8 => -8
2、當一個負數是2^n時,它的補碼:補碼等於原碼有效數字所位,前補1,後補0。
-8 => 1 <1> 000 => 11000 //當然,前面還可以補許多1,但沒意義,只要位數夠運算就行
-2 => 1 <1> 00 =>  11100

11000
11100
11000//結果補碼,結果便是:1000 => 8 取負,-8

三、按位或| :除去符號位,有1為1
例:-3|-6
-3 補碼:11111101
-6 補碼:11111010
結果補碼:11111111
結果反碼:11111110//補碼減1
結果原碼:00000001 //反碼再求反,-1

總結:
1、有負為負。

四、按位異或^ :相異為1,相同為0
例:-3^-6
-3 補碼:11111101
-6 補碼:11111010
結果補碼:00000111//已然為正,故為7

總結:同號為正,異號為負。

五、按位取反~ :0、1互換
例:~-3
-3 補碼:11111101
結果補碼:00000010//已然為正,故為2

總結:正負相換。

六、按位右移>> : 排除符號位,二進位制數整體向右移動。

7 >> 2 => 0111 => 0001 = 1 // 這裡向右移動了2位,最低位的兩個1被抹去。

七、按位左移<< : 與上同理。
7 << 2 => 0111 => 011100 = 28 // 這裡向右移動了2位,最低位的兩個1被抹去。
總結:右移兩位等於除了2的二次方,7/4 = 1 在整數除法中則看成是被舍掉了小數部分。左移就是剩以2的二次方,PHP沒有無符號右移運算子>>>