It's not hexadecimal instead of ints, hexadecimal is a way to represent ints just like decimal is. It's hexadecimal instead of decimal or octal or binary - but all four of those produce integers.
If C++ supported native binary literals, that would be even more preferable (note: binary literals will be in the new C++14 standard).
With binary literals, it'd look like:
enum Flags {None = 0b,
Flag1 = 1b,
Flag2 = 10b,
Flag3 = 100b,
Flag4 = 1000b,
Flag5 = 10000b,
Flag6 = 100000b,
DefaultFlags = (Flag3 | Flag2 | Flag6),
etc... };
It more clearly displays that each flag takes up only a single bit, and shows what bit they take.
They aren't just going 1, 2, 3, 4, like normal enums or constants, because normal enums can only be used one at a time; either you're using EnumValueA, or you're using EnumValueB.
With bit flags, you want to be able to use multiple flags at once - any combination that makes sense.
So you do: (Flag2 | Flag5 | Flag3) using bitwise OR operator, not the && logical AND operator.
Regardless of the order OR'd together (Flag2 | Flag5 | Flag3) becomes 10110b.
Because of this great feature, every flag needs to take one single bit that it exclusively uses.
Here's an example paraphrased from my own code library:
StringList results = Seperate("red, green , , blue, \"text with, comma in it\"", ',', RemoveEmptySegments | RemoveWhitespacePadding | PreserveTextInQuotes);
results = {"red", "green", "blue", "text with, comma in it"}