位運算

位運算 7句話概括:

 ① 二進制最高位是符號位:0表示正數,1表示負數

 ② 正數原碼,反碼,補碼都一樣
 ③ 負數的反碼=它的原碼符號位不變,其它位取反(0->1,1->0)
 ④ 負數的補碼=它的反碼+1
 ⑤ 0的反碼,補碼都是0
 ⑥ php沒有無符號數,換言之,php中的數都是有符號數

 ⑦ 在計算機運算的時候,都是以補碼的方式來運算的


  二進制表示一個數,這個碼就是 原碼

1 的源碼 ----> 00000000  00000000  00000000 00000001

00000000  00000000  00000000  00000101  

=> 1*2的零次方 + 0 * 2的一次方 + 1*2的二次方  + 0*2的零三方 + ...+ 0 +... =  1+0+4+0+..+0+.. = 5


-1  的源碼 ----> 10000000  00000000  00000000  0000001

-1  的反碼 ----> 11111111  11111111  11111111  11111110

-1  的補碼 ----> 11111111  11111111  11111111  11111111


----------------------------------------------------------------------------------------------------------------------------------------------

   php中有4個位運算符,分別是“按位與&、按位或|、按位異或^,按位取反~”

 按位與&:   兩位全爲1,結果爲1
 按位或|:     兩位有一個爲1,結果爲1
 按位異或^:兩位有一個爲0,一個爲1 ,結果爲1
 按位取反~:0->1,1->0


 比如:  ~2=-3    2&3=2   2|3=2   2^3=1


echo ~2;  // -3


2 的源碼:00000000  00000000  00000000  00000010 (正數的源碼,反碼,補碼都一樣)

2 取反:    11111111  11111111  11111111 11111101   (計算以補碼方式運算,運算結果也是補碼,需要轉換成源碼輸出

其反碼:   11111111  11111111  11111111  11111100   (負數的補碼=反碼+1,故反碼=補碼-1)

其源碼:   10000000  00000000  00000000  00000011    (負數反碼=它的源碼符號位不變,其他位取反。理解成:負數源碼=他的反碼符號位不變,其他位取反)


輸出值:-3


echo ~-5;  //  4


-5 的源碼:10000000  00000000  00000000  00000101 

-5 的反碼:11111111  11111111  11111111  11111010

-5 的補碼:11111111  11111111  11111111  11111011


~-5 取反: 00000000  00000000  00000000  00000100


輸出值: 4



2&3 首先找到 2 和 3 的補碼
 2 的補碼 00000000 00000000 00000000 00000010
 3 的補碼 00000000 00000000 00000000 00000011
2&3          00000000 00000000 00000000 00000010【補碼】


輸出值:2


2|3 首先找到 2 和 3 的補碼
 2 的補碼 00000000 00000000 00000000 00000010
 3 的補碼 00000000 00000000 00000000 00000011
2|3            00000000 00000000 00000000 00000011【補碼】


輸出值:3



 
2^3 首先找到 2 和 3 的補碼
 2 的補碼 00000000 00000000 00000000 00000010
 3 的補碼 00000000 00000000 00000000 00000011
2^3           00000000 00000000 00000000 00000001【補碼】


輸出值:1


-----------------------------------------------------------------------------------------------------------------------------------------------------


php 中 移位運算符
>>(右移) <<(左移) 算數右移和算數左移,運算規則
算數右移:低位溢出,符號位不變,並用符號位補溢出位的高位
算數左移:符號位不變,低位補0


1>>2 
1 的補碼 00000000 00000000 00000000 00000001


右移2位  ??000000 00000000 00000000 00000000 01
                00000000 00000000 00000000 00000000


輸出值:0



-1>>2 
-1 的源碼   10000000 00000000 00000000 00000001
-1 的反碼   11111111 11111111 11111111 11111110
-1 的補碼   11111111 11111111 11111111 11111111
右移2位     ??111111 11111111 11111111 11111111 11
                   11111111 11111111 11111111 11111111 【補碼】
補碼->反碼->源碼
其反碼      11111111 11111111 11111111 11111110
其源碼      10000000 00000000 00000000 00000001



輸出值:-1



1<<2
1 的補碼 00000000 00000000 00000000 00000001
左移2位  00 00000000 00000000 00000000 000001??
                00000000 00000000 00000000 00000100


輸出值:4



其他方式依此類推。



發佈了41 篇原創文章 · 獲贊 11 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章