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