Chinaunix首页 | 论坛 | 博客
  • 博客访问: 865387
  • 博文数量: 82
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 2007
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 22:19
文章分类

全部博文(82)

文章存档

2012年(82)

分类: C/C++

2012-07-18 15:56:18

不知道大家有没有想过O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR 为什么不是&&而是一个|呢。

按位或运算:参加运算的两个数据,按二进位进行“或”运算,如果两个相应的二进位都为0,则该位的结果值为0,否则为1,

按位与运算:参加运算的两个数据,按二进位进行“与”运算,如果两个相应的二进位都为1,则该位的结果值为1,否则为0,

      显然,这里要用位或,而不是与。在fcntl.h中,可以见到O_WRONLY的定义值是"01",八位就是"00000001",O_CREAT是"0100",二进制就是"01000000",竖线“|”不是“与”,是逐位“或”算,O_RWONLY|O_CREAT合起来就是"01000001“,这两个"1"的位置并不冲突,在这里,open()函数得到的值是已经合并好了的值"01000001",open()函数可以根据这两个独立的二进制"位"知道是读写打开或者创建。 后面类推

平时我们都不知道什么情况下要用位运算,其实,对于通信协议里面,无效载荷应该尽量减少,用位结构的比较多。
对于设备的控制,设备地址空间有限,控制和状态一般只有开和关,用位操作的也比较多。对于惜byte如金的单片机bool型变量也通常用位来表示。C语言一般的程序里,也经常用位来保存状态信息。

阅读(2163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~