首页
社区
课程
招聘
[求助]按位操作疑问
发表于: 2009-9-24 10:17 4517

[求助]按位操作疑问

2009-9-24 10:17
4517
看了文件过滤驱动的代码,在生成绑定设备之后,再拷贝重要标志位,其中拷贝重要标志位的一句代码:
if(harddiskobj->Flags & DO_BUFFERED_IO)  //
      myfilterobj->Flags |= DO_BUFFERED_IO;

这句代码的逻辑含义是什么呢? 明白按位与& 和 按位或| 运算符的操作。但这句代码的逻辑意思是什么呢 ?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pak
2
把那句代码转换下:
int a= 16, b=4, c = 0; //
if( a&b )
     c |= b;

这个if 语句的逻辑含义是什么呢? 不需解释& 或 | 的含义,这个清楚。
2009-9-24 10:28
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这样?
如果 harddiskobj->Flags有DO_BUFFERED_IO标志位,则

给myfilterobj->Flags添加DO_BUFFERED_IO标志位
2009-9-24 10:29
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pak
4
DO_BUFFERED_IO = 0x00000004 ,二进制也就是0100。
若harddiskobj->Flags是十进制5,也就是0101。
那 harddiskobj->Flags & DO_BUFFERED_IO 结果为0100,也就是4,结果非0。
此时那也就是说harddiskobj->Flags有DO_BUFFERED_IO标志位? 转不过来弯。
2009-9-24 10:38
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
myfilterobj->Flags |= DO_BUFFERED_IO;其实应该是:
myfilterobj->Flags = (myfilterobj->Flags )|(DO_BUFFERED_IO);
2009-9-24 10:47
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pak
6
嗯。就是不明白其中的逻辑意义,如何理解 if 语句这段代码 ?
2009-9-24 10:50
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
对于DO_BUFFERED_IO标志位
如果harddiskobj有,那么myfilterobj一定要有,不管之前有没有。
如果harddiskobj没有,那么myfilterobj保持不变,之前可以有,也可以没有。
2009-9-24 11:12
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pak
8
谢谢。终于有些开窍了。我的理解:

程序转化下看着方便:
int a =5, b = 4, c =5; // b是一个标志,a和c 任意初始化
if( a & b)
   c |= b;

这样理解:

    根据源程序上下文,其中b 是一个结构体的成员,这个成员用来作为结构体的一个标志。b的二进制为:00000100。
实际上b右数第三位的1就是这个标志位,也就是十进制的标志。

if(a & b)   //如果a & b为非0,也就是当a的标志位(右数第三位)为1,则该条件成立。
c = c | b;  // c | b 这句按位或,也就是将c 的标志位(右数第三位)设置成1,其他位不变。
也就是只看二进制位有没有标志位1,若有,则该变量有这个标志;否则,则没有标志。
不知表达清楚没有。
2009-9-24 11:46
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主的c要加油啊
2009-9-24 13:00
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pak
10
是啊
2009-9-24 13:01
0
游客
登录 | 注册 方可回帖
返回
//