位運算 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
其他方式依此類推。