位操作學(xué)習(xí)
位操作是程序設(shè)計(jì)中對(duì)位模式或二進(jìn)制數(shù)的一元和二元操作,位運(yùn)算比加減運(yùn)算速度略快,,通常位運(yùn)算比乘除運(yùn)算要快很多,。
取反(NOT)
取反是一元運(yùn)算符,對(duì)一個(gè)二進(jìn)制數(shù)的每一位執(zhí)行邏輯反操作,,使數(shù)組1變成0,,使0變成1。例如:
NOT 0001(十進(jìn)制7)
= 1000(十進(jìn)制8)
許多的程序語(yǔ)言中,,取反操作符用的是~ 表示,,此操作符與邏輯非操作符不同,在c++中,,邏輯非將數(shù)組整體看作一個(gè)bool類型——將真值轉(zhuǎn)為假值,,將假值轉(zhuǎn)化為真值,而c語(yǔ)言將0轉(zhuǎn)化為1,,將非零值轉(zhuǎn)化為0,,邏輯非并不是一個(gè)位操作。
按位或(OR)
按位與處理兩個(gè)長(zhǎng)度相同的二進(jìn)制數(shù),,兩個(gè)相應(yīng)的二進(jìn)制中只要有一個(gè)為1,,該位的結(jié)果值為1。
? 0101
OR 0011
= 0111
按位或能夠?qū)⒚恳晃豢醋髌鞓?biāo),,在二進(jìn)制書中的每一位可以表示不同的布爾變量,,使用按位或操作可以將二進(jìn)制數(shù)的某一位設(shè)為1。這一技巧通常用來保存大量的布爾變量,。
按位異或(XOR)
按位異或運(yùn)算,,對(duì)于長(zhǎng)二進(jìn)制模式或者二進(jìn)制數(shù)的每一位執(zhí)行邏輯異或操作,操作的結(jié)果是如果某位不同則該位為一,,否則該位為0,。
? 0101
XOR 0011
? = 0110
在匯編語(yǔ)言中可以使用按位異或作為寄存器的值設(shè)為0的捷徑。
按位異或也可以用于在比特集合中切換旗標(biāo),,這一技巧可用于操作布爾變量的比特模式,。
按位與(AND)
按位與處理兩個(gè)長(zhǎng)度相同的二進(jìn)制數(shù),,兩個(gè)相應(yīng)的二進(jìn)制數(shù)都為1,,則該位的結(jié)果為1,否則為零,。
0101
AND 0011
?= 0001
移位
移位是一個(gè)二元運(yùn)算符,,用來將一個(gè)二進(jìn)制數(shù)中的每一位全部向一個(gè)方向移動(dòng)指定位,,溢出的部分將會(huì)被舍棄,而空缺的部分填入一定的值,。
可以進(jìn)行移位的數(shù)據(jù)類型:
char,、short、int,、long,、unsigned char、unsigned short,、unsigned int,、unsigned long
不可以進(jìn)行移位的數(shù)據(jù)類型:
double、float,、bool,、long double
邏輯移位
對(duì)于邏輯移位,就是不考慮符號(hào)位,,移位的結(jié)果只是數(shù)據(jù)所有的位數(shù)進(jìn)行移位,。根據(jù)移位操作的目的,左移時(shí),,低位補(bǔ)0,,右移時(shí),高位補(bǔ)0
算術(shù)移位
算術(shù)是帶有符號(hào)的數(shù)據(jù),,所以我們直接移動(dòng)所有的位數(shù),,這可能會(huì)使得符號(hào)不正確。
關(guān)于數(shù)的移位,,特別需要注意正數(shù),,三碼相同,所以無論左移還是右移都是補(bǔ)0.而負(fù)數(shù)的補(bǔ)碼就需要注意,,左移在右邊補(bǔ)0,,右移需要在左邊補(bǔ)1,有一個(gè)很有趣的誤區(qū)是,,認(rèn)為符號(hào)位保持不變,,僅僅移動(dòng)數(shù)據(jù)位,這是不對(duì)的,,因?yàn)闊o論數(shù)據(jù)位還是符號(hào)位,,都是二進(jìn)制,在整體大遷移的過程中,,符號(hào)位也是要跟隨潮流的,。只不過,為了保證右移后,,和原來的符號(hào)數(shù)一樣,,因此,,負(fù)數(shù)在右移時(shí)左邊補(bǔ)1.
常見的位運(yùn)算問題
1,、位運(yùn)算實(shí)現(xiàn)乘除法
一個(gè)數(shù)向右移一位相當(dāng)于除以2,,向左移相當(dāng)于乘以2
2,、位操作交換兩數(shù)
位操作交換兩數(shù)可以不需要第三個(gè)臨時(shí)變量,,雖然普通操作也可以做到,但是沒有其效率高
//普通交換
void swap(int& a,int& b)
{
a = a + b;
b = a - b;
a = a - b;
}
//異或操作
void swap(int& a,int& b)
{
if(a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
3,、位操作統(tǒng)計(jì)二進(jìn)制中 1 的個(gè)數(shù)
count = 0
while(a){
a = a & (a - 1);
count++;
}
|