1. 程式人生 > >神奇的C語言二十一:談談位運算

神奇的C語言二十一:談談位運算

寫C程式時位運算還是很常用的,您肯定也很瞭解位運算的基本規則。下面是位運算的部分應用。

亦或^:

可以實現位取反,例如:

char a = 0x0F;
a ^= 0xFF;
// 現在,a變成了0xF0

特性:兩個相同的數的亦或結果是0。多個數亦或滿足交換律。

有道ACM題就是利用了這一點:2*n+1個數,有2*n個數字倆倆相同,只有1個數和其他數都不同,請找出這個數。

利用此特性還可以在不使用輔助變數的情況下交換兩個變數的值(不過最好別這麼做)。

此特性還可以用於將變數清零,不過這多用於彙編中。

或|:

可以實現將某位置1的操作,例如:

char a = 0xF2;
char mask = 0x04;
// 將第三位置1
a |= mask;
// a現在是0xF6

 與&:

可以實現將某位清0,例如:

char a = 0xF2;
char mask = 0xFD;
a &= mask;
// 現在a是0xF0

測試某位是否為1:,例如:

char a = 0xFF;
char mask = 0x01;
if (a & mask != 0) // 則第一位為1

左移<<:

低位向高位進行移位,高位被移出的位被丟棄,低位移入0。

右移>>:

高位向低位進行移位,高位移入原來的符號位,低位移出的位被丟棄。

位移運算常常被用來做快速的乘2和除2運算,不過要注意的是,他們之間並沒有逆運算的關係。除2運算的結果是四捨五入的整數,所以最好只對2的次方數進行右移除2運算。