3

次のコードがあります:

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 が渡されたことを確認するにはどうすればよいですか。ありがとう!

4

4 に答える 4

8

ここで基本的なビット操作を少し見逃しているようです。FD_READ と FD_WRITE (| = ビットごとの OR) を OR し、両方の値で示されるビットをパラメーターとして設定します。FD_READ が渡されたかどうかを確認するには、次のように lNetworkEvents と FD_READ の AND を取り、結果が FD_READ と等しいかどうかを確認する必要があります。

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

もちろん、これは FD_READ と FD_WRITE がこのように使用されることを意図した値であることを前提としています (つまり、通常、重複するビットはありません)。

編集:修正済み、wabepperは絶対に正しいです:)おっと!

于 2012-06-29T10:12:20.260 に答える
2
if ( (iNetworkEvents & FD_READ) != 0 )

ここで探しているものです。これは、問題の「引数」が1ビット(ブール値)である限り、うまく機能します。のようなより複雑な操作の場合floatfieldfmtflags、正しい値と比較する必要があります。

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

//  ...
}

最後に、フィールドが整数値(たとえば0...7、3ビット)の場合、正しい値を取得するには、マスクとシフトの両方を行う必要があります。(値が署名されている場合は、さらに複雑になります。)

于 2012-06-29T10:16:38.457 に答える
2

を使用して&

if ((lNetworkEvents & FD_READ) == FD_READ) {
    ...
}
于 2012-06-29T10:14:31.813 に答える
1

http://www.cplusplus.com/doc/boolean/ - 役立つかもしれません

非常に単純化した説明: 想像してみてください

FD_READ = 0b01
FD_WRITE = 0b10

次に、渡すFD_READ | FD_WRITE0b11引数として渡されます

あるかどうかを確認するFD_READには、基本的にその最後のビットが1であるかどうかを確認します。

x & 0b01 // aka
x & FD_READ
于 2012-06-29T10:15:38.563 に答える