位(bit)運算

一、二進(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容