Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Neues Problem: Bitmask

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.08.2006, 12:51 Uhr
FunnyDingo



Hallo zusammen,

ich hoffe ich nerve nicht mit meinen dutzenden Fragen *g*. Irgendwie verstehe ich das mit den Bitoperatoren noch nicht so ganz.

Da ich eine Netzwerk-Applikation schreibe, nutze ich Poll um die Sockets zu pürfen. Nun bin ich an einem Punkt angelangt, an dem mir Poll als revents die 25 (Dez) ausgibt. Hex ist dies die 19, aber ich verstehe nicht wie ich auf die 19 komme. Die in der bits/poll.h definierten Konstanten sind:

C++:
#define POLLIN          0x001           /* There is data to read.  */
#define POLLPRI         0x002           /* There is urgent data to read.  */
#define POLLOUT         0x004           /* Writing now will not block.  */
# define POLLRDNORM     0x040           /* Normal data may be read.  */
# define POLLRDBAND     0x080           /* Priority data may be read.  */
# define POLLWRNORM     0x100           /* Writing now will not block.  */
# define POLLWRBAND     0x200           /* Priority data may be written.  */
# define POLLMSG        0x400
# define POLLREMOVE     0x1000
# define POLLRDHUP      0x2000
#define POLLERR         0x008           /* Error condition.  */
#define POLLHUP         0x010           /* Hung up.  */
#define POLLNVAL        0x020           /* Invalid polling request.  */


Wenn ich nun verschiede dieser Werte mit OR verknüpfe, werden sie immer größer (Beispiel POLLIN | POLLNVAL = 33 (Dez)).

Ich könnte natürlich in meinem Code direkt prüfen ob revents == 25 ist, aber protabel ist das ja nicht wirklich. Wo habe ich da den Denkfehler?

lg,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.08.2006, 13:50 Uhr
Airdamn



Verstehe nicht Dein Problem.
Willst Du wissen welche Bits in revents gesetzt sind?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.08.2006, 13:55 Uhr
FunnyDingo



Ja genau, habe das vielleicht ein wenig schlecht ausgedrückt.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.08.2006, 14:12 Uhr
ao

(Operator)


0x19 ergibt sich aus POLLIN | POLLERR | POLLHUP

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.08.2006, 15:02 Uhr
Airdamn




C++:
int revents = POLLIN | POLLNVAL;

if(( revents & POLLIN ) == POLLIN )
    //POLLIN-Flag gesetzt

if(( revents & POLLNVAL ) == POLLNVAL )
   //POLLNVAL-Flag gesetzt

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.08.2006, 16:29 Uhr
0xdeadbeef
Gott
(Operator)


Kleine Anmerkung: Die konventionelle Schreibweise hier ist verkürzt

C++:
if(revents & POLLIN) { ...}
if(revents & POLLNVAL) { ...}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.08.2006, 17:56 Uhr
FunnyDingo



Ui, wie einfach *g* Dem entsprechend sollte

C++:
if ((readFDS[counter].revents & POLLIN) || (readFDS[counter].revents & POLLERR) || (readFDS[counter].revents & POLLHUP)) { ... }

wahr sein, falls revents POLLIN oder POLLERR oder POLLHUP ist, richtig? (Zumindest hats im Testlauf funktioniert.)
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.08.2006, 20:56 Uhr
0xdeadbeef
Gott
(Operator)


Du könntest auch schreiben

C++:
if(revents & (POLLIN | POLLERR | POLLHUP)) { ... }


Das ist dann wahr, wenn eines oder mehrere der drei bits POLLIN, POLLERR und POLLHUP gesetzt sind.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.08.2006, 21:05 Uhr
FunnyDingo



Praktisch... Vielleicht sollte ich mich mal intensiver mit BitOperating beschäftigen, dachte bisher immer "brauch ich nicht", aber wie man sieht, brauch man es doch und es sieht sehr spannend aus.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.08.2006, 13:38 Uhr
0xdeadbeef
Gott
(Operator)


Es ist vor allem ein ziemlich performanter Weg, bestimmte Dinge zu erledigen - Prozessoren kommen mit Bitoperationen erstaunlich gut zurecht, also sind diese Dinge für performancekritische Applikationen so ziemlich unerlässlich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: