The whole BIT enum idea is practically pointless once you get binary literals:
You're still going to want to give them names, right?
Descriptive names for actual flags and masks? Absolutely! But for names like BIT_ONE, BIT_TWO? Probably not. I don't have enums for decimal literals: ONE = 1, TWO = 2, and I don't really see too much of a need for enumerating each bit in an integer, unless the names actually carry meaning.
I don't want to have put in a comment explaining what bit "0b001000" is when I could have used something with a name instead. And writing "0b001000" doesn't look any better than writing (1 << 3) to me.
Aye, that's true: 1 << 3 is relatively compact and clear.
Perhaps digit separators can make it (somewhat) easier to read though: 0b'0010'1000, especially when multiple bits are set.
(digit separators work with other numeral literals, like floats: 0.123'456'789, or integers: 1'200'350)
Unfortunately, unlike binary literals (already available in GCC), I don't think any compiler has digit separators implemented, since they only finally settled on the symbol to use just last month (it'll possibly make it into C++14 with binary literals) - I wish they would've gone with a space instead, but there were too many problems.
You're correct that in actual code, I'd use a descriptively named constant. Magic numbers, regardless of base, are likely to bite later in a project.
I'm just glad binary literals are finally in the standard.