[轉載]《更好的解釋(數學篇)》——第四章
-
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沒有無符號右移運算子>>>