天天看點

c語言位取反的作用,C語言位運算符及作用:與、或、異或、取反、左移和右移...

一、& 按位與

如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0

應用:

(1)清零

若想對一個存儲單元清零,即使其全部二進制位為0,隻要找一個二進制數,其中各個位符合一下條件:

原來的數中為1的位,新數中相應位為0。然後使二者進行&運算,即可達到清零目的。

a 00101011

b 10010100

c 00000000 //c = a & b

(2)取一個數中某些指定位

若有一個整數a(2byte),想要取其中的低字節,隻需要將a與8個1按位與即可。

a 00101100 10101100

b 00000000 11111111

c 00000000 10101100 //c = a & b

(3)保留指定位:

a 01010100

b 00111011

c 00010000 //c = a & b

二、| 按位或

兩個相應的二進制位中隻要有一個為1,該位的結果值為1。借用邏輯學中或運算的話來說就是,一真為真

應用:將一個數據的某些位定值為1

a 00110000

b 00001111

c 00111111 //c = a | b

三、^ 按位異或

若參加運算的兩個二進制位值相同則為0,否則為1

應用:不用臨時變量,交換兩個值

計算前:

a=3,即011(2);b=4,即100(2)

計算過程:

a=a ^ b; //即111 = 011 ^ 100

b=b ^ a; //即011 = 100 ^ 111

a=a ^ b; //即100 = 111 ^ 011

計算後:

a=100(2)即 4 ;b = 011(2)即 3;

四、~ 取反

~是一進制運算符,用來對一個二進制數按位取反,即將0變1,將1變0

五、<< 左移

用來將一個數的各二進制位全部左移N位,右補0

六、>> 右移

將一個數的各二進制位右移N位,移到右端的低位被舍棄,對於無符號數,高位補0

七、原碼, 反碼, 補碼的基礎概念和計算方法

在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念《雜諞桓鍪? 計算機要使用一定的編碼方式進行存儲。原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.

(1)原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值.

比如如果是8位二進制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符號位. 因為第一位是符號位, 是以8位二進制數的取值範圍就是:

[1111 1111 , 0111 1111] 即 [-127 , 127]

原碼是人腦最容易了解和計算的表示方式。

(2)反碼

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可見如果一個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

(3)補碼

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.

補碼舉例:16位的變量求補碼,比如-266的補碼求法:( ( 266 ^ 0xffff ) + 1 ) 結果是0xfef6

c語言位取反的作用,C語言位運算符及作用:與、或、異或、取反、左移和右移...