Thinking in C++ Vol 2 - Practical Programming |
Prev |
Home |
Next |
Because C is a language that purports to be close to the
hardware, many have found it dismaying that there is no native binary
representation for numbers. Decimal, of course, and hexadecimal (tolerable only
because it s easier to group the bits in your mind), but octal? Ugh. Whenever
you read specs for chips you re trying to program, they don t describe the chip
registers in octal or even hexadecimal they use binary. And yet C won t let you
say 0b0101101, which is the obvious solution for a language close to the
hardware.
Although there s still no native binary representation in
C++, things have improved with the addition of two classes: bitset and vector<bool>, both of which are designed to manipulate a group of
on-off values. The
primary differences between these types are:
Each bitset holds a fixed number of bits. You establish
the quantity of bits in the bitset template argument. The vector<bool>
can, like a regular vector, expand dynamically to hold any number of bool
values.
The bitset template is explicitly designed for performance
when manipulating bits, and is not a regular STL container. As such, it has
no iterators. The number of bits, being a template parameter, is known at
compile time and allows the underlying integral array to be stored on the
runtime stack. The vector<bool> container, on the other hand, is a
specialization of a vector and so has all the operations of a normal vector the
specialization is just designed to be space efficient for bool.
There is no trivial conversion between a bitset and a
vector<bool>, which implies that the two are for very different
purposes. Furthermore, neither is a traditional STL container. The bitset
template class has an interface for bit-level operations and in no way
resembles the STL containers we ve discussed up to this point. The vector<bool>
specialization of vector is similar to an STL-like container, but it
differs as discussed below.
Thinking in C++ Vol 2 - Practical Programming |
Prev |
Home |
Next |