c语言的魅力之一在于,可以使用c语言对变量中的个别位进行操作。在很多场合我们都需要这样的操作,如:许多压缩和加密操作都需要对单独的位进行操作;控制硬件设备时,需要向设备发送一两个字节,其中的每一位都有特定的意义。
在研究c语言操作位能力之前,我们先来了解一些二进制计数法和其他基数的一些知识。
十进制、十六进制和二进制等价数
1.二进制的1和0可以用于表示计算机内存和寄存器中位的打开和关闭,因此计算机硬件与二进制熟悉系统紧密相连,这也是c语言程序能与硬件设备和操作系统相连接的关键。
正如每个二进制数字表示一位一样,每个八进制数字表示三位,每个十六进制数字表示四位,从而会让我们在二进制、八进制以及十六进制之间转换变得相对简单,如上图所示。
在通常的说,我们平时所使用的文件或者其他数据,都可以以二进制形式打开,常用工具为Uedit,然后你会发现,数据其实都是这样的:
一个图片的部分二进制数据
2.简单了解的二进制,我们现在来谈谈位运算符。位运算符含义简单说就是因为这些运算符单独操作一个值(或变量)中的每一位。
-
位反运算符(~):将操作数中的每一位取反,将1转换为0或将0转换为1;
-
位与运算符(&):如果两个操作数中的某位都为1,那么结果值便为1,否则,改为便是0;
-
位或运算符( | ):如果两个操作数的某位中某一位为1,那么结果该位就为1;当两位都是0的时候,该位才是0;
-
位异或运算符(^):仅在两个操作数的对应位中只有一位设为1的时候,结果为才为1.
我们简单举几个例子说明一下:
3.除了上述常用的位运算符,还提供了左移(<<)和右移(>>)运算符。通过将一个位组合中的所有位向左或者向右移动指定数量的位形成新值。对于左移运算符,空出的位设为0,对于右移运算符,如果是无符号类型,则空出的位为0,对于有符号的值,正数空出来的值填0,负数则填1.
对于位运算符是不是加深了理解呢,如果有,就最好了。
每天进步一点点,每天消化一点点,如果你有更好的想法,欢迎一起交流。如果觉得文章对你有所帮助,点个赞呗。
,