| Home | Libraries | People | FAQ | More

##### Bit Operations

In this example we'll show how individual bits within an integer may be manipulated, we'll start with an often needed calculation of 2n - 1, which we could obviously implement like this:

    using boost::multiprecision::cpp_int;

    cpp_int b1(unsigned n)
    {
       cpp_int r(1);
       return (r << n) - 1;
    }

Calling:

    std::cout << std::hex << std::showbase << b1(200) << std::endl;

Yields as expected:

    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

However, we could equally just set the n'th bit in the result, like this:

    cpp_int b2(unsigned n)
    {
       cpp_int r(0);
       return --bit_set(r, n);
    }

Note how the `bit_set` function sets the specified bit in its argument and then returns a reference to the result - which we can then simply decrement. The result from a call to `b2` is the same as that to `b1`.

We can equally test bits, so for example the n'th bit of the result returned from `b2` shouldn't be set unless we increment it first:

    BOOST_MP_ASSERT(!bit_test(b1(200), 200));     // OK
    BOOST_MP_ASSERT(bit_test(++b1(200), 200));    // OK

And of course if we flip the n'th bit after increment, then we should get back to zero:

    BOOST_MP_ASSERT(!bit_flip(++b1(200), 200));   // OK