首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中,如何在一个参数中测试与"|“组合的几个标志中的一个?

在C++中,如何在一个参数中测试与"|“组合的几个标志中的一个?
EN

Stack Overflow用户
提问于 2012-06-29 18:05:33
回答 4查看 249关注 0票数 3

我有下一个代码:

代码语言:javascript
运行
复制
int main()
{
 OwnSelect(23, FD_READ | FD_WRITE); // <---- Several arguments as one
 return 0;
}

int OwnSelect(SOCKET s, long lNetworkEvents)
{
 // How can i check that FD_READ has been passed?
 if(lNetworkEvents == FD_READ)
 {
  // never here
 }
 return 0;
}

无论是否通过FD_READ传递了另一个FD,如何检查是否传递了FD_READ。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-29 18:12:20

看起来你在这里错过了一些基本的比特操作。您正在对FD_READ和FD_WRITE进行OR运算(| =逐位OR),从而将这两个值指示的位设置为参数。要检查是否传递了FD_READ,需要使用FD_READ对lNetworkEvents进行AND操作,并检查结果是否等于FD_READ,如下所示:

代码语言:javascript
运行
复制
 `if (FD_READ == (lNetworkEvents & FD_READ)) { ... }` 

当然,这是假设FD_READ和FD_WRITE是应该以这种方式使用的值(即通常没有重叠的位)。

编辑:修正,wabepper是绝对正确的:)哦!

票数 8
EN

Stack Overflow用户

发布于 2012-06-29 18:14:32

通过使用&

代码语言:javascript
运行
复制
if ((lNetworkEvents & FD_READ) == FD_READ) {
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2012-06-29 18:16:38

代码语言:javascript
运行
复制
if ( (iNetworkEvents & FD_READ) != 0 )

就是你在这里要找的。只要有问题的“参数”是一个单比特(布尔值),这种方法就能很好地工作。对于更复杂的操作,比如fmtflagsfloatfield上的操作,您需要与正确的值进行比较:

代码语言:javascript
运行
复制
switch (myFlags & std::ios_base::floatfiled )
{
case std::ios:base::fixed:
    //  ...

//  ...
}

最后,如果字段是整数值(例如3位的0...7 ),则必须同时使用掩码和移位才能获得正确的值。(如果值是有符号的,则会更加复杂。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11259846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档