1. 程式人生 > >5、位運算子、按位與、按位或、按位非、左移、右移、原碼、反碼、補碼

5、位運算子、按位與、按位或、按位非、左移、右移、原碼、反碼、補碼



位運算子的基本規則
1,位運算子都是針對整數的二進位制數字形式而進行的。
2,按位與運算基本規則(規則表):
1 & 1 ==> 1
1 & 0 ==> 0
0 & 1 ==> 0
0 & 0 ==> 0;
3, 按位或運算基本規則
1 | 1 ==> 1;
1 | 0 ==> 1;
0 | 1 ==> 1
0 | 0 ==> 0
4,按位非運算:
~ 1 ==> 0
~ 0 ==> 1
5,按位異或運算:
1 ^ 1 ==> 0
0 ^ 0 ==> 0
1 ^ 0 ==> 1
0 ^ 1 ==> 1
規律:相同就是0,不同就是1

按位與運算:&
形式:A & B; //A和B都是數字,其實是常規的10進位制數字,但內部會按二進位制進行計算
含義:將A和B的二進位制形式的每一個位上的二進位制數字進行按位與(&)運算之後的結果。
說明:一個數字的二進位制形式通常是32位的0和1的組合,也可能是64位,但未了說明問題,我們通常只用8位。
舉例:
$r1 =  9 & 13; //9的二進位制是“1001”,13的二進位制是“1101”
結果是“00001001”,即9

按位或運算:
形式:A | B; //A和B都是數字,其實是常規的10進位制數字,但內部會按二進位制進行計算
含義:將A和B的二進位制形式的每一個位上的二進位制數字進行按位或(|)運算之後的結果。
舉例:
$r1 =  18 | 10; //18的二進位制是“10010”,23的二進位制是“1010”
結果是“00011010”,即26

按位左移運算:<<
形式: A << n; //A是一個要被移動的數字,同樣可以是普通數字,但按二進位制去運算,n是一個指定要移動的位數
含義:將數字A的二進位制形式的每一個位上的數字往左邊移動指定的位數n,則最左邊的n位移出去了就不管了,最右邊空出來的n位,補0就可以。
舉例:
$r1 = 9 << 2; //9的二進位制形式為:1001
結果是:32 + 4 = 36

按位右移運算:>>
形式: A >> n; //A是一個要被移動的數字,同樣可以是普通數字,但按二進位制去運算,n是一個指定要移動的位數
含義:將數字A的二進位制形式的每一個位上的數字往右邊移動指定的位數n,則最右邊的n位移出去了就不管了,最左邊空出來的n位,補0就可以(對正數,實際是補符號位)。
舉例:
$r1 = 9 >> 2; //9的二進位制形式為:1001
結果就是:2

按位非:
將一個數字的二進位制形的每一個二進位制數字取反所得到的結果

按位異或:
將2個整數的二進位制形式的每一個對應數字進行異或運算之後的結果。

原碼,反碼,補碼介紹
原碼:就是“原來的二進位制碼”,其實就是我們可以理解的按10進位制轉換為二進位制之後得到的一個字元碼。
原碼在數學上都是可以理解的。
但在實際的計算機的執行過程中,卻常常不用原碼,所以就有反碼,補碼的問題。
在此基礎上上,規則:一個二進位制數字的第一個位是符號位,0表示正數,1表示負數。
舉例(都以8位為例):
7:   00000111
-7:   10000111
反碼:
正數的反碼是其本身。
負數的反碼,就是將原碼的非符號部分,每一位取反。
舉例:
7:   00000111
-7:   11111000

補碼:
正數的補碼是其本身。
負數的反碼,符號位不變,其餘每一位取反之後,整體加1(即反碼加1)
舉例:
7:   00000111
-7:   11111001