C语言中的位操作
2016-04-12 17:24
323 查看
一、二进制整数
大家都清楚,计算中是以二进制数来表示的。那么为什么在计算机中,一个字节等于8位呢?这又是怎么得出来的呢?百度知道上的答案如下:“所谓字节,原意就是用来表示一个完整的字符的。最初的计算机性能和存储容量都比较差,所以普遍采用4位BCD编码(这个编码出现比计算机还早,最早是用在打孔卡上的)。BCD编码表示数字还可以,但表示字母或符号就很不好用,需要用多个编码来表示。后来又演变出6位的BCD编码(BCDIC),以及至今仍在广泛使用的7位ASCII编码。不过最终决定字节大小的,是大名鼎鼎的System/360。当时IBM为System/360设计了一套8位EBCDIC编码,涵盖了数字、大小写字母和大部分常用符号,同时又兼容广泛用于打孔卡的6位BCDIC编码。System/360很成功,也奠定了字符存储单位采用8位长度的基础,这就是1字节=8位的由来。”
二、掩码
掩码:是某些位设为开(1)而某些位设为关(0)的位组合。c中的“&”按位与符号通常跟掩码一起使用。正面看个例子:
#define MASK 2 /* 0000 0010*/ int main(){ int flags = 1; flags = flags & MASK; return 0; }
注意:flags = flags & MASK这条语句将使flags的二进制值除位1之外的所有位都将被置为0,因为它的其它位在&位与运行符与0组合下都等于0;因为掩码中的0覆盖了flags中的相应的位,因此该过程也称为“使用掩码”。
2.1:用运算符打开位,关闭位
在硬件中,我们针对端口编程时,经常会置某个端口为高电平或低电平,即某位置为1或0,而其它位保持不变,这时我们可以使用“位或”来实现置1,使用&来实现置0。2.1.1:置1
例如:MASK其位1设为1.我们就可以用“|”来实现flags中的位1设为1,并保留其他所有位不变。flags |= MASK;
2.1.2:置0
同上,如果MASK其位1还是设为1,那么我们可以用如下的方法来让flags中位1置为0.先把MASK的所有位取反,使其位1置为0,其他所有位置为1,然后再复用“&”位与运算符,来得到结果。
flags = flags & (~MASK);
2.2:用运算符实现“转置位”
转置(toggling)一个位表示如果该位为1,则置为0,反之则反之。比如:b 的值为0,它的二进制数为0000 0000,则通过转置使b==1,
b = 1 ^ b;
三、移位运算符
移位运算符能够提供快捷、高效的(依赖于硬件)对2的幂的乘、除法。注:正面表格所示只针对 unsigned无符号数。
Tables | Are |
---|---|
number << n | number乘以2的n次幂 |
number >> n | number除以2的n次幂 |
(RGB:分别对应低位,高位)
#define BYTE_MASK oxff unsigned long color = 0x002a162f; unsigned char blue,green,red; red = color & BYTE_MASK; green = (color >> 8) & BYTE_MASK; blue = (color >> 16) & BYTE_MASK;