鱼C论坛

 找回密码
 立即注册
查看: 3006|回复: 4

关于位或问题

[复制链接]
发表于 2013-6-4 03:20:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
比如 C语言中的初级I/O函数:
open(const char *pathname, int oflat, .../* mode_t mode*/);
为什么可以这样:
open(/home/test.txt, O_WRONLY | O_CREAT | O_TRUNC, mode);
请问里面的 O_WRONLY | O_CREAT | O_TRUNC是代表有O_WRONLY O_CREATE P_TRUNC这三种吧
为什么要用位与? 用||不行吗, 比如 O_WRONLY || O_CREAT || O_TRUNC???
是不是只能用位或才能代表几种的意思?
为什么呢?open(/home/test.txt, O_WRONLY | O_CREAT | O_TRUNC, mode);
这里面的O_WRONLY为01,O_CREAT为0100, O_TRUNC为1000,
所以,上面的O_WRONLY|O_CREAT|O_TRUNC的结果为:1101????
而1101代表什么呢???
不知大家有没有明白我想问的问题没。。。。


关键是为什么"位或"后, 能代表多种的意思。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 08:18:58 | 显示全部楼层
O_WRONLY为0x0001
O_CREAT为0x0100
O_TRUNC为0x1000
       对于 || 而言,结果只有真和假:只要表达式中有一个为真,整个表达式就为真。而上面三个明显不为0,因此(O_WRONLY ||  O_CREAT || O_TRUNC )为真。因为只有真和假两种状态,用||的话只能表示两种属性。而这里O_WRONLY 、O_CREAT、O_TRUNC要表达的状态明显不止两种。所以是不行滴。
       对于位或 | 而言,如果我们指定O_WRONLY那么它的第0位值就是1,指定O_CREAT则第8位(因为是16进制)为1,指定O_TRUNC则第12位为1。我们判断它是否具有上面三个属性的时候只要检测相应的位是否是1就行了。比如我们指定属性 O_WRONLY |  O_CREAT ,那么位或运算后的结果就是0x0101,也就是二进制0000 0001 0000 0001, 我们检测其第0位,发现是1,因此O_WRONLY属性肯定是指定了的。我们再检测第八位,发现也是1,因此O_CREAT属性也是指定了的。再看第12位,12位是0,所以O_TRUNC属性没有被指定。通过判断一个数的每个位是否置1的状况,我们就能判断它的属性。
      额。。。不知道你清楚了没。如果你如何对位或求值不清楚,那还是建议多看看书。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-5 04:20:45 | 显示全部楼层

也就是说, 与结果的二进制位是否为1有关?
比如第一位为1就代表什么, 第二位为1又代表什么,因为系统固定了哪一位为1就有哪一个属性?所以, 当要有多种属性时, 比如,可读,追加, 创建等, 就相当于把二进制相对应的位设为1就行了?就有那几个属性 了????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-5 09:29:10 | 显示全部楼层
喜欢散步 发表于 2013-6-5 04:20
也就是说, 与结果的二进制位是否为1有关?
比如第一位为1就代表什么, 第二位为1又代表什么,因为系统固 ...

可以这么理解。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-26 22:54:34 | 显示全部楼层
     18                    没咋看懂,不过希望以后能和大家在鱼C里一起学习!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-10 15:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表