Bitmask switch statement

Jeg har denne kode i et afsnit af mit projekt:

enum myEnum
{
    invalid = -1,
    val1 = 1,
    val2 = 2,
    val3 = 4
};

int bitmask = val1 | val3;

if(bitmask & val1)
    ...
if(bitmask & val2)
    ...
if(bitmask & val3)
    ...

Dette er fint, og det fungerer perfekt, men jeg har altid spekuleret på, om det kunne gøres med en switch. Jeg var tænker noget i retning af dette:

int checkMask(int& mask)
{
    for(int i = 0; mask; mask &= ~(1 << i++))
    {
        if(mask & (1 << i))
        {
            int ret = mask & (1 << i);
            mask &= ~ret;
            return ret;
        }
    }

    return invalid;
}

#define START_BITMASK_SWITCH(x) int xcopy = x; while(xcopy) { switch(checkMask(xcopy))
#define END_BITMASK_SWITCH };

int bitmask = val1 | val3;

START_BITMASK_SWITCH(bitmask)
{
    case val1:
        ...
        break;
    case val2:
        ...
        break;
    case val3:
        ...
        break;
}
END_BITMASK_SWITCH

så mine spørgsmål er:

  • har jeg lige løst mit problem? Jeg formoder, at jeg har det, men er det en ren løsning?
  • er der en enklere måde at opnå dette på?
  • er det en dårlig idé at blande #definer og funktioner?
  • 6
    задан Tom 7 July 2011 в 08:17
    поделиться