按位與,按位或,按位異或,按位取反
位運算符:是指對二進制位從低位到高位對齊後進行運算。
1、按位與 &
二進制“與”運算規則:1&1=1 1&0=0 0&0=0
例如: $n=6; $m=12; $n&$m=???
其中;
6 = 二進制 110;
12= 二進制1100;
$n&$m=10
0110
1100
==》0100(二進制)===》10(十進制)
2、按位或 |
二進制“或”運算規則:1|1=1 1|0=1 0|0=0
3、按位異或 ^
參與運算的兩個值,如果兩個相應位相同,則結果為0,否則為1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
例如:10100001^00010001=10110000
0^0=0,0^1=1 0異或任何數=任何數
1^0=1,1^1=0 1異或任何數-任何數取反
任何數異或自己=把自己置0
(1)按位異或可以用來使某些特定的位翻轉,如對數10100001的第2位和第3位翻轉,可以將數與00000110進行按位異或運算。
10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6
(2)通過按位異或運算,可以實現兩個值的交換,而不必使用臨時變量。例如交換兩個整數a,b的值,可通過下列語句實現:
a=10100001,b=00000110
a=a^b; //a=10100111
b=b^a; //b=10100001
a=a^b; //a=00000110
(3)異或運算符的特點是:數a兩次異或同一個數b(a=a^b^b)仍然為原值a.
4、按位取反~
二進制每一位取反,0變1,1變0。
~9的計算步驟: 轉二進制:0 1001 計算補碼:0 1001 按位取反:1 0110 _____ 轉為原碼: 按位取反:1 1001 |
~-9的計算步驟: 轉二進制:1 1001 計算補碼:1 0111 按位取反:0 1000 _____ 轉為原碼: 正數的補碼和原碼相同,仍為:0 1000,即8 |
原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其余位表示數值的大小。例如,用8位二進制表示一個數,+11的原碼為00001011,-11的原碼就是10001011。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
(1) 原碼:在數值前直接加一符號位的表示法。
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
註意:
a. 數0的原碼有兩種形式:
[+0]原=0 0000000 B
[-0]原=1 0000000 B
b. 8位二進制原碼的表示範圍:-127~+127
(2)反碼:
正數:正數的反碼與原碼相同。
負數:負數的反碼,符號位為“1”,數值部分按位取反。
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
註意:
a. 數0的反碼也有兩種形式,即
[+0]反=0 0000000 B
[-0]反=1 1111111 B
b. 8位二進制反碼的表示範圍:-127~+127
(3)補碼
正數:正數的補碼和原碼相同。
負數:負數的補碼則是符號位為“1”。並且,這個“1”既是符號位,也是數值位。數值部分按位取反後再在末位(最低位)加1。也就是“反碼+1”。
求負整數的補碼,原碼符號位不變,先將原碼減去1,最後數值各位取反。(但由於2進制的特殊性,通常先使數值位各位取反,最後整個數加1。) |
例如: 符號位 數值位
[+7]補= 0 0000111 B
[-7]補= 1 1111001 B
註意: a. 采用補碼後,可以方便地將減法運算轉化成加法運算,運算過程得到簡化。正數的補碼即是它所表示的數的真值,而負數的補碼的數值部份卻不是它所表示的數的真值。采用補碼進行運算,所得結果仍為補碼。 b. 與原碼、反碼不同,數值0的補碼只有一個,即 [0]補=00000000B。 c. 若字長為8位,則補碼所表示的範圍為-128~+127;進行補碼運算時,應註意所得結果不應超過補碼所能表示數的範圍。 |
轉化為原碼已知一個數的補碼,求原碼的操作其實就是對該補碼再求補碼: ⑴如果補碼的符號位為“0”,表示是一個正數,其原碼就是補碼。 ⑵如果補碼的符號位為“1”,表示是一個負數,那麽求給定的這個補碼的補碼就是要求的原碼。 |
5、向左移位<<
6、向右移位>>
按位與,按位或,按位異或,按位取反