在C++中,如何在一个参数中测试多个标志之一和"|"?

In C++, how can I test for one of several flags combined with "|" in one argument?

本文关键字:标志 测试 C++ 一个 参数      更新时间:2023-10-16

我有下一个代码:

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 是否已通过FD_READ,我如何检查是否已通过FD_READ。谢谢!

似乎您在这里错过了一些基本的位操作。您将FD_READ和FD_WRITE (| = 按位 OR) 进行 OR,从而将两个值指示的位设置为参数。要检查FD_READ是否被传递,您需要使用 FD_READ 和 lNetworkEvents 并检查结果是否等于 FD_READ,如下所示:

if (FD_READ == (lNetworkEvents & FD_READ)) { ... }

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

编辑:固定,Wabepper是绝对正确的:)哎呀!

通过使用&

if ((lNetworkEvents & FD_READ) == FD_READ) {
    ...
}
if ( (iNetworkEvents & FD_READ) != 0 )

就是您在这里寻找的。 只要有问题的"参数"是一个比特(布尔值)。 对于更复杂的操作,例如fmtflagsfloatfield的操作,您将需要要与正确的值进行比较,请执行以下操作:

switch (myFlags & std::ios_base::floatfiled )
{
case std::ios:base::fixed:
    //  ...
//  ...
}

最后,如果字段是整数值(例如 0...7 3 位),您必须同时屏蔽和移位才能获得正确的值。 (如果值是有符号的,它甚至更复杂。

http://www.cplusplus.com/doc/boolean/- 这可能会对你有所帮助

一个非常简单的解释:想象一下

FD_READ = 0b01
FD_WRITE = 0b10

然后传递FD_READ | FD_WRITE会给你0b11作为论据

检查FD_READ是否存在基本上是检查最后一位是否1,可以通过以下方式进行:

x & 0b01 // aka
x & FD_READ