神奇的C語言二十一:談談位運算
阿新 • • 發佈:2019-02-02
寫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運算。