您的位置:首页 > 编程语言 > C语言/C++

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无符号数。

TablesAre
number << nnumber乘以2的n次幂
number >> nnumber除以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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: