一、二進(jìn)制:所謂二進(jìn)制就是逢二進(jìn)一 (0,1), 因為使用二進(jìn)制只有 0, 1 兩個數(shù),簡單,易于電子方式實現(xiàn) , 同時,通過0,1 組合可以表示任意一個數(shù).
二進(jìn)制有三個重要的概念:
1.原碼
用二進(jìn)制來表示一個數(shù),這個碼就是原碼.
1 ------> 原碼 00000000 0000000 0000000 00000101 = 12的零次方+02的一次方+1* 2的二次方=1+0+4=5
2.負(fù)數(shù)的反碼=它的原碼符號位不變,其它位取反(0->1,1->0)
反碼(正數(shù)的反碼和它的原碼一樣 , 負(fù)數(shù)反碼 是 符號位不變其它位取反)
補碼(正數(shù)的補碼和它的原碼一樣,負(fù)數(shù)的補碼是 它的反碼+1)
舉例
-1
-1的原碼 10000000 00000000 00000000 00000001
-1的反碼 11111111 11111111 11111111 11111110
-1 的補碼 11111111 11111111 111111111 11111111
3.在計算機(jī)運算的時候,都是以補碼的方式來運算的
4+5=>計算機(jī) 4-5=4+(-5)
這句話意思就是,不管一個數(shù)是正數(shù)還是負(fù)數(shù),都要被轉(zhuǎn)成補碼,然后進(jìn)行運算.
位運算一覽表:

該圖的前面四個是位運算
其運算規(guī)則是:
按位與&?。骸晌蝗珵椋保Y(jié)果為1
按位或| : 兩位有一個為1,結(jié)果為1
按位異或 ^ : 兩位一個為0,一個為1,結(jié)果為1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>
步驟 : 首先要求出 2的補碼
2是正數(shù) 所以 原碼=反碼=補碼
2 原碼
00000000 00000000 00000000 00000010
~2
11111111 11111111 11111111 11111101 (補碼)->原碼
? 負(fù)數(shù)的 原碼-》反碼-》補碼
11111111 11111111 11111111 11111101->
推出其反碼 (對補碼-1)
11111111 11111111 11111111 11111100
推出原碼
10000000 00000000 00000000 0000011 -> -3
~-5=?
-5 的 補碼找出來.
-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 和 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 中位運算有兩種 >> (右移) << (左移)
運算的規(guī)則是 :
算術(shù)右移:低位溢出,符號位不變,并用符號位補溢出的高位
算術(shù)左移: 符號位不變,低位補0
根據(jù)我們前面的規(guī)范,來完成幾個案例
$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 補碼
結(jié)果
補碼->原碼
反碼 11111111 11111111 11111111 11111110
原碼 10000000 0000000 00000000 00000001
$c=1<<2;
1<<2
1的補碼
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
$d=-1<<2;