Bitweise Operatoren 0x0000 Abfrage



  • Hallo,
    ich habe da mal eine Frage bezüglich der bitweisen Operatoren und der Abfrage einer Flagge die mit 0x0000 deklariert wurde.

    wie kann man eine solche Fahne abfragen, wenn noch andere Flaggen mit der Bitweisen OR verknüpft wurden.

    #define WS_OVERLAPPED       0x00000000L
    #define WS_CAPTION          0x00C00000L   
    #define WS_SYSMENU          0x00080000L
    
    DWORD dwStyle =   WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU;
    
    (dwStyle & WS_SYSMENU) ? TRUE : FALSE; //Ist TRUE
    (dwStyle & WS_CAPTION ) ? TRUE : FALSE; //Ist TRUE
    (dwStyle & WS_OVERLAPPED) ? TRUE : FALSE; //Ist FALSE
    

    kann mir da jemand helfen?
    danke schonmal im voraus!



  • wie kann man eine solche Fahne abfragen

    WS_OVERLAPPED (zumindest in modernen Windowsversionen) und andere Flags mit dem Wert 0 kannst du als immer gesetzt ansehen.

    __inline BOOL
    is_ws_set(DWORD style, DWORD ws)
    {
      return ws == 0L ? TRUE : style & ws;
    }
    


  • Einfach die korrekte Abfrage verwenden. Die funktioniert dann auch für keine oder mehrere gesetzte Bits in flags .

    BOOL is_set(DWORD set, DWORD flags)
    {
    	return (set & flags) == flags;
    }
    
    DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU;
    assert(is_set(dwStyle, WS_SYSMENU));
    assert(is_set(dwStyle, WS_CAPTION));
    assert(is_set(dwStyle, WS_OVERLAPPED));
    


  • TyRoXx schrieb:

    Einfach die korrekte Abfrage verwenden. Die funktioniert dann auch für keine oder mehrere gesetzte Bits in flags .

    BOOL is_set(DWORD set, DWORD flags)
    {
    	return (set & flags) == flags;
    }
    

    x & 0 == 0



  • vielen dank für euer antworten,

    Ein Gast schrieb:

    ...andere Flags mit dem Wert 0 kannst du als immer gesetzt ansehen.

    aber warum macht man dann Flaggs mit 0 werten, wenn man diese eh immer als gesetzt ansieht?

    [EDIT]

    __inline BOOL 
    is_ws_set(DWORD style, DWORD ws) 
    { 
      return ws == 0L ? TRUE : style & ws; 
    }
    

    was mir dabei gerade an dem code so auffällt. wird hier nur TRUE zurückgegeben,
    wenn style mit nichts (0x0L) belegt ist und man WS_OVERLAPPED abfrägt.
    wenn style mit (0x00C00000L) belegt ist und ich WS_OVERLAPPED abfrage kommt auch wieder FALSE zurück.


Log in to reply