補碼與位運算

2021-09-29 13:38:40 字數 1497 閱讀 6032

計算機中的資料按補碼形式儲存,因此在進行位運算時,直接操作的是補碼。正數的原碼、反碼和補碼是其本身。

對於負數而言,

原碼轉補碼:符號位不變,其他位按位取反;

反碼轉原碼:同原碼轉反碼,即反碼的反碼等於原碼;

原碼轉補碼:符號位不變,其他位按位取反然後加1;

補碼轉原碼:同原碼轉補碼,即補碼的補碼等於原碼。

相應位都是1時取1,否則為0。

用途:判斷二進位制中1的個數;判斷末位是否為1;判斷奇偶;

(1) 消去x最右邊的1。

y=(x-1) & x

// 例如x為1100,x-1為1011,則y為1000,相當於將x最右側的一位1變成了0

(1) 應用一: o(1)的時間判斷整數n是否是2的冪次。

// 若整數n是2的冪次,則n的二進位制中有且僅有1個1

if((n-1)&n==0)

return true;

else

return false;

(2) 應用二: 計算整數n的二進位制表示中有多少個1。

int count=0;

while(n)

(3) 應用三:將整數a轉換為整數b,共需要改變多少個bit位。

// 如a為1101,b為1000,共需改變2個bit位

// 演算法:將a與b異或,則數值不同的位會變成1,然後計算1的個數,即a和b不同的二進位制的bit位的個數,就是所求的需要改變的位數。

c=a^b;

int count=0;

while(c)

3、按位或(|)

存在1為1,否則為0。

4、按位異或(^)

不同為1,否則為0。

(記住任何數異或自己都為0;任何數異0都為本身;進行異或的數可以無序交換)

用途:兩個數的交換。(由於乙個數連續兩次與同乙個數進行異或是其本身,即a∧b∧ba a \wedge b \wedge baa∧b∧b==a)

(1) 應用一:實現兩個數的交換

// 下面實現將a和b交換:

a=a^b;

b=a^b;

a=a^b;

(2) 應用二:陣列中,只有乙個數出現一次,其他數都出現2次,找出出現1次的那個數

int a[7]=;

int num=0; // 任何數與0異或都是其本身

for(int i=0;i<7;i++)

return num;

5、左移(<<)

左移n位,即右補n個0。

用途:左移1位相當於乘以2。

6、右移(>>)

右移n位,即左補n個符號位。

用途:右移1位,相當於除以2。

補碼與位運算

參與位運算的數字都是二進位制補碼的方式進行按位與 或 異或,所以先說說二進位制 原碼 反碼 補碼。在c語言中,原碼 反碼 補碼都是有符號定點數的表示方法。乙個有符號定點數的最高位為符號位,0是正,1是負,下面統一以8位的整數為例介紹這幾種碼 原碼 如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二...

補碼與位運算

3 按位或 4 按位異或 6 右移 位運算主要包括按位與 按位或 按位異或 取反 左移 右移 由於位運算直接操作的是記憶體,運算速度相對較快,採取位運算能有效提公升程式執行效率。如用右移代替除以2操作,1代替對2取餘操作 計算機中的資料按補碼形式儲存,因此在進行位運算時,直接操作的是補碼。正數的原碼...

位運算 補碼

令x x 1 x,直到x變為0。原理 x x 1 會把x的二進位制中最後乙個1變為0.整數x和2 n的模 x 2 n 1 原理 2 n 1 的二進位制是n個1,和x進行與運算,會保留x的二進位制的後n位 計算機中的有符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號...