位运算算是从汇编语言一代传下来的老东西了,只有寥寥6个运算符。乍一看,你会说它没什么用处,那么你只对了一半:站在现在的高级编程角度来讲,确实用处不大;但是在涉及硬件底层的编程(如驱动程序,嵌入式开发)里,需要很强的操纵硬件能力,这时,就常常涉及到位运算。
位运算有6个运算符,它们分别是:&(与)、|(或)、^(异或)、~(取反)、>>(右移)、<<(左移)。其含义如下表所示:
运算符 | 含义 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
笔者也是因为单片机才接触位运算的。但是总不能把Atmega128点亮LED的例程作为例子讲解。接下来,以几个实用的例子助你登入位运算的大门:
例1.判断一个数的奇偶性:常常会遇到判断一个数奇偶的情况,这时候,常用的方法是模2取余。这种方法的效率略慢(虽然只是常数),可以用位运算取代。方法是将这个数与1进行与运算。这样,如果结果是1,即为奇数,否则就是偶数。原理:与1进行与运算即取操作数的第1位,而第一位是1,则数为奇数,否则数为偶数。
例2.交换两个整数:如果这两个整数是x和y,那么最常用的方法就是使用临时变量tmp,先将x赋值给tmp,再将y赋值给x,最后将tmp赋值给y。这样的方法无疑需要更多内存。而下面的方法则不用那个讨厌的临时变量。
x ^= y; y ^= x; x ^= y;
神奇吧?原理?只要记住异或的反操作是自己。对一个操作数进行两次相同的异或操作,最后会回到原来的值。
例3.看下面那段简单的代码:
if (x == a) x= b; else x=a;
这段代码也可以使用位运算来改变。让它变得,额…更有逼格。它等价于:
x=a^b^x;
……其实位运算的例子不止这么点,包括子网掩码,iostream的状态等也用到了这个运算。而它的执行速度是固然比其他运算快的(毕竟计算机基于2进制)。所以,卡常量的朋友们,你们可以试试--