1. 程式人生 > >按位與,按位或,按位異或,按位取反

按位與,按位或,按位異或,按位取反

spa 位運算 符號 targe 取反 span 特殊性 一個 target

位運算符:是指對二進制位從低位到高位對齊後進行運算。

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
末位加一:1 1010
符號位為1是負數,即-10


~-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、向右移位>>

按位與,按位或,按位異或,按位取反