補碼與位運算

2021-09-16 12:57:03 字數 1708 閱讀 4764

3、按位或(|)

4、按位異或(^)

6、右移(>>)

位運算主要包括按位與(&)、按位或(|)、按位異或(^)、取反(~)、左移(<<)、右移(>>)。由於位運算直接操作的是記憶體,運算速度相對較快,採取位運算能有效提公升程式執行效率。(如用右移代替除以2操作,&1代替對2取餘操作)

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

對於負數而言,

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

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

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

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

已知[ x]

補[x]_補

[x]補

​,求[−x

]補

[-x]_補

[−x]補​

:符號位和數值位都取反,末位加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)

存在1為1,否則為0。

不同為1,否則為0。

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

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

∧b==

aa \wedge b \wedge b==a

a∧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。

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

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

位運算——強大得令人害怕

常見的位運算

資料結構與演算法系列之——位運算全解,弄懂位運算

補碼與位運算

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

補碼與位運算

計算機中的資料按補碼形式儲存,因此在進行位運算時,直接操作的是補碼。正數的原碼 反碼和補碼是其本身。對於負數而言,原碼轉補碼 符號位不變,其他位按位取反 反碼轉原碼 同原碼轉反碼,即反碼的反碼等於原碼 原碼轉補碼 符號位不變,其他位按位取反然後加1 補碼轉原碼 同原碼轉補碼,即補碼的補碼等於原碼。相...

位運算 補碼

令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位 計算機中的有符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號...