C语言有时候被称为中级语言 ,即介于低级与高级之家的编程语言,原因是C语言不仅具有高级语言抽象机制,也具有低级语言直接操作变量个别位的能力,即我们即将要讨论的C语言强大的位 操作运算。C语言的这种能力也许会让你感到奇怪,但这种能力有时确实是必须的,或者至少是有用的,例如我们通常向硬件设备发送一两个字节来控制该设备,其 中的每一位都有特定的含义。许多压缩和加密操作都对单独的位进行操作。高级语言一般不处理这一级别的细节,可C语言在提供高级语言便利的同时也能够在典型的为汇编语言所保留的级别上工作 ,这就是C语言之所以能成为编写设备驱动程序和嵌入式代码首选语言的原因。
在正式进入美妙的主题C语言位运算 的讨论之前,我们必须先了解一些酷炫的背景知识:
一、二进制
说到计算机当然不能不知道二进制,就像玩吉他不能不知道五线谱一样,所谓二进制就是逢二进一 ,我们日常用的是十进制,逢十进一。另外,十进制的数字每一位对应一个10的某次幂,二进制的数字每一位对应一个2的某次幂。比如:
(5017)10 = 5 *103 + 0 *102 + 1 *101 + 7 *100 = 5000 + 0 + 10 + 7 = (5017)10
(1101)2 = 1 *23 +1 *22 + 0 *21 + 1 *20 = 8 + 4 + 0 + 1 = (13)10
二进制系统可以用1、0序列表示任何整数,这种系统非常始于数字计算机使用,数字计算机使用打开和关闭状态的组合来表示信息,二这些状态可以使用1和0来表示。
我们的计算机内部是怎么用二进制系统表示数字17的呢?通过简单的计算我们知道(57)10 = 32 + 16 + 8 + 1 = (0111 1001)2 ,即计算机中使用0111 1001这样一串数字表示十进制的57,因此在存储器上就有类似于如下的结构:
|0 |1 |1 |1 |