浅谈位运算

      位运算算是从汇编语言一代传下来的老东西了,只有寥寥6个运算符。乍一看,你会说它没什么用处,那么你只对了一半:站在如今的高级编程角度来说,确实用处不大;可是在涉及硬件底层的编程(如驱动程序,嵌入式开发)里,须要很强的操纵硬件能力,这时,就经常涉及到位运算。ios

      位运算有6个运算符,它们分别是:&(与)、|(或)、^(异或)、~(取反)、>>(右移)、<<(左移)。其含义以下表所示:编程

运算符 含义
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

      笔者也是由于单片机才接触位运算的。可是总不能把Atmega128点亮LED的例程做为例子讲解。接下来,以几个实用的例子助你登入位运算的大门:spa

      例1.判断一个数的奇偶性:经常会遇到判断一个数奇偶的状况,这时候,经常使用的方法是模2取余。这种方法的效率略慢(虽然只是常数),能够用位运算取代。方法是将这个数与1进行与运算。这样,若是结果是1,即为奇数,不然就是偶数。原理:与1进行与运算即取操做数的第1位,而第一位是1,则数为奇数,不然数为偶数。code

      例2.交换两个整数:若是这两个整数是x和y,那么最经常使用的方法就是使用临时变量tmp,先将x赋值给tmp,再将y赋值给x,最后将tmp赋值给y。这样的方法无疑须要更多内存。而下面的方法则不用那个讨厌的临时变量。blog

       x ^= y; 
       y ^= x; 
       x ^= y;

神奇吧?原理?只要记住异或的反操做是本身。对一个操做数进行两次相同的异或操做,最后会回到原来的值。内存

      例3.看下面那段简单的代码:ci

      if (x == a) x= b; 
                else x=a;

这段代码也可使用位运算来改变。让它变得,额…更有逼格。它等价于:开发

      x=a^b^x;

      ……其实位运算的例子不止这么点,包括子网掩码,iostream的状态等也用到了这个运算。而它的执行速度是当然比其余运算快的(毕竟计算机基于2进制)。因此,卡常量的朋友们,大家能够试试--io

相关文章
相关标签/搜索